【发布时间】:2017-09-29 05:10:52
【问题描述】:
我在 MacBook 和 Ubuntu 上玩 golang 1.7.3,发现 runtime.GOMAXPROCS 限制为 256。有谁知道这个限制来自哪里?这是否记录在任何地方,为什么会有限制?这是实现优化吗?
我只能在描述 golang 运行时包的页面上找到 256 的引用:https://golang.org/pkg/runtime/。 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 调度程序使用的操作系统线程数相关的文档(如果有的话)。我们要观察运行 GOMAXPROCS OS 线程的 go 编译代码吗?
编辑:感谢@twotwotwo 指出 GOMAXPROCS 与操作系统线程的关系。仍然有趣的是,文档没有提到这个 256 限制(其他在 MemStats 结构中可能相关也可能不相关)。
我想知道是否有人知道这个 256 数字的真正原因。
【问题讨论】:
-
"GOMAXPROCS变量限制了可以同时执行用户级Go代码的操作系统线程数。代表Go代码在系统调用中可以阻塞的线程数没有限制; 这些不计入 GOMAXPROCS 限制。此包的 GOMAXPROCS 函数查询并更改限制。来自运行时文档。在答案中多写一点。
标签: go