戈朗:为什么runtime.GOMAXPROCS被限制为256?
我在MacBook和Ubuntu上玩golang 1.7.3,发现runtime.GOMAXPROCS限制在256。有人知道这个限制是从哪里来的吗?是否在任何地方记录了这一点?为什么会有限制?这是实现优化吗 我能找到的唯一对256的引用是在这个描述golang运行时包的页面上:。runtime.MemStats结构有两个大小为256的stat数组:戈朗:为什么runtime.GOMAXPROCS被限制为256?,go,Go,我在MacBook和Ubuntu上玩golang 1.7.3,发现runtime.GOMAXPROCS限制在256。有人知道这个限制是从哪里来的吗?是否在任何地方记录了这一点?为什么会有限制?这是实现优化吗 我能找到的唯一对256的引用是在这个描述golang运行时包的页面上:。runtime.MemStats结构有两个大小为256的stat数组: type MemStats struct { ... PauseNs [256]uint64 // circular b
type MemStats struct {
...
PauseNs [256]uint64 // circular buffer of recent GC pause durations, most recent at [(NumGC+255)%256]
PauseEnd [256]uint64 // circular buffer of recent GC pause end times
下面是我使用的golang代码示例:
func main() {
runtime.GOMAXPROCS(1000)
log.Printf("GOMAXPROCS %d\n", runtime.GOMAXPROCS(-1))
}
印刷品
GOMAXPROCS 256
附言。
另外,有人能给我指一下关于GOMAXPROCS如何与golang调度器使用的OS线程计数相关的文档(如果有的话)。我们应该观察运行GOMAXPROCS OS线程的go编译代码吗
编辑:感谢@TwoTwo指出GomaxProc与OS线程的关系。但有趣的是,文档中并没有提到这256个限制(MemStats结构中的其他限制可能相关,也可能无关)
我想知道是否有人知道这256个数字的真正原因。请澄清GOMAXPROCS与操作系统线程的关系:
GOMAXPROCS变量限制可以同时执行用户级Go代码的操作系统线程数。代表Go代码在系统调用中可以阻止的线程数量没有限制;这些不计入GOMAXPROCS限制。此包的GOMAXPROCS函数查询并更改限制 因此,您可以看到更多的GOMAXPROCS OS线程(因为有些线程在系统调用中被阻塞,并且没有限制线程的数量),或者更少(因为GOMAXPROCS只是为了限制线程的数量而记录的,而不是确切地规定线程的数量) 我认为对GOMAXPROCS进行封顶符合该文档的精神——您指定可以使用1000个运行Go代码的OS线程,但运行时决定“仅”运行256个。这并不限制goroutine活动的数量,因为它们被多路复用到操作系统线程上——当一个goroutine阻塞(比如等待网络读取完成)时,Go的内部调度程序在同一操作系统线程上启动其他工作 Go团队可能会做出这样的选择,以尽量减少Go程序最终运行的操作系统线程数是当今大多数机器内核数的数倍;这将导致更多的操作系统上下文切换,这可能比用户模式goroutine切换要慢,如果gomaxproc的CPU核数保持在现有的水平,就会出现这种切换。或者,对于design Go的内部调度程序来说,在GOMAXPROCS上设置一个上限可能很方便
不是完美的,例如goroutines现在没有分段堆栈,但它可能会帮助您了解引擎盖下的情况。注意,从下一个Go 1.10(2018年第一季度)开始,
GOMAXPROCS
将受到以下限制。。。没什么
运行时不再人为地限制GOMAXPROCS
(以前限制为1024)
请参阅,这将修复
既然allp
是动态分配的,就不需要硬上限了
在GOMAXPROCS
上
另见:
runtime
:清除allp上的循环
allp
现在具有长度gomaxprocs
,这意味着allp[i]
中没有一个为零或处于状态\u Pdead
这允许使用正常范围循环替换allp上的几种不同样式的循环
i:=0的;i
循环的范围可以超过
allp
同样地,在allp[:gomaxprocs]
上的范围循环可以只在
allp
检查p==nil | | p.state==u Pdead
的循环不需要检查
再也不会这样了
检查p==nil
的循环不必在Ps死的情况下进行检查
不要影响他们。我检查了所有这些循环,事实上,
不受死Ps影响。一个回路可能受到影响,这
通过将p.gcAssistTime
中的procresize
归零进行修复
“GOMAXPROCS变量限制可以同时执行用户级Go代码的操作系统线程数。代表Go代码的系统调用中可以阻止的线程数没有限制;这些线程数不计入GOMAXPROCS限制。此包的GOMAXPROCS函数查询并更改限制。”来自运行时文档。在回答中多写一点。