Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
戈朗:为什么runtime.GOMAXPROCS被限制为256?_Go - Fatal编程技术网

戈朗:为什么runtime.GOMAXPROCS被限制为256?

戈朗:为什么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

我在MacBook和Ubuntu上玩golang 1.7.3,发现runtime.GOMAXPROCS限制在256。有人知道这个限制是从哪里来的吗?是否在任何地方记录了这一点?为什么会有限制?这是实现优化吗

我能找到的唯一对256的引用是在这个描述golang运行时包的页面上:。runtime.MemStats结构有两个大小为256的stat数组:

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函数查询并更改限制。”来自运行时文档。在回答中多写一点。