我看到有人将runtime.GOMAXPROCS
设置为runtime.NumCPU()
以启用 并行 处理。 Official documentation没有说明GOMAXPROCS
的上限;我可以将它设置为任意正整数,或者它应该始终小于eq。到NumCPU
值?
我尝试将其设置为大于 逻辑 核心#
的数字,我的代码工作得很好
答案 0 :(得分:3)
由于运行时与您的操作系统交互,因此大多数情况下您不需要混淆GOMAXPROCS
。 GOMAXPROCS
过去默认为1,但使用Go 1.5,它现在默认为NumCPU()
将其设置为高于NumCPU只会使调度程序更多(不必要)处理OS线程。
答案 1 :(得分:2)
最大值为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
)
二进制形式的bitshift是100000000
,1是int
,在64位系统上Go使得为Int64,这意味着最大值为256 。 (在Go中具有int
的32位系统将是int32,但是相同的值为256)
现在,只要将其设置为超过核心数量 - 这一切都取决于您正在发生的工作负载和CPU上下文切换(例如,您的程序强制发生了多少锁,或者您使用{{ 1}}无处不在等)。
请记住,如果需要发生,Golang会抽象出上下文切换。
基准测试是你的朋友。如果您的应用程序运行10,000个goroutine,几乎没有cpu上下文切换(遵循良好的设计模式),那么是将该吸盘碰到256并让它骑。如果你的应用程序窒息并通过上下文切换/线程创建了大量的CPU等待时间,那么将其设置为8或4,甚至可以让所有mutex.Lock()
锁定进行调整。