2 回答
TA贡献1886条经验 获得超2个赞
GOMAXPROCS
由于运行时会为您与操作系统进行交互,因此您不需要在大多数时候搞砸。 GOMAXPROCS
过去默认为 1,但在 Go 1.5 中,现在默认为NumCPU()
将其设置为高于 NumCPU 只会为调度程序提供更多(不必要的)处理操作系统线程的工作。
TA贡献1848条经验 获得超6个赞
最大值为 256;但请注意,如果您将其设置得更高,则不会出错。
https://golang.org/src/runtime/debug.go?s=534:560#L7
12 // GOMAXPROCS sets the maximum number of CPUs that can be executing
13 // simultaneously and returns the previous setting. If n < 1, it does not
14 // change the current setting.
15 // The number of logical CPUs on the local machine can be queried with NumCPU.
16 // This call will go away when the scheduler improves.
17 func GOMAXPROCS(n int) int {
18 if n > _MaxGomaxprocs {
19 n = _MaxGomaxprocs
20 }
21 lock(&sched.lock)
22 ret := int(gomaxprocs)
23 unlock(&sched.lock)
24 if n <= 0 || n == ret {
25 return ret
26 }
27
28 stopTheWorld("GOMAXPROCS")
29
30 // newprocs will be processed by startTheWorld
31 newprocs = int32(n)
32
33 startTheWorld()
34 return ret
35 }
Line 19将总数设置为_MaxGomaxprocs。
这是...
https://golang.org/src/runtime/runtime2.go?h=_MaxGomaxprocs#L407
const (
// The max value of GOMAXPROCS.
// There are no fundamental restrictions on the value.
_MaxGomaxprocs = 1 << 8
)
二进制形式的位移是100000000和 1 是int在 64 位系统上,Go 使其成为 Int64,这意味着最大值是 256。(intGo 中的32 位系统将是 int32,但值为 256)
现在,只要将其设置为多于您的内核数量 - 这一切都取决于您的工作负载和正在发生的 CPU 上下文切换(例如,您的 go 程序强制发生多少锁,或者您是否mutex.Lock()在任何地方使用等)。
请记住,无论是否需要,Golang 都会抽象出上下文切换。
基准测试是您的朋友。如果您的应用程序运行 10,000 个 goroutine,而几乎没有 cpu 上下文切换(遵循良好的设计模式),那么是的,将那个吸盘提升到 256 并让它运行。如果您的应用程序阻塞并通过上下文切换/线程创建大量 CPU 等待时间,则将其设置为 8 或 4,甚至可以在所有mutex锁定进行时为其提供喘息的空间。
- 2 回答
- 0 关注
- 258 浏览
添加回答
举报