Go运行时(调度程序,垃圾收集器等)可以使用多少个线程?例如,如果GOMAXPROCS
是10
,那么运行时将使用多少个内核线程?
我正在阅读the rationale,在Go 1.5中将GOMAXPROCS
更改为runtime.NumCPU()
。有一句话声称“由于运行时的并行性,特别是垃圾收集器,提升GOMAXPROCS
可以提高单个goroutine程序的性能。”
我真正的问题是:如果我在具有CPU配额的Docker容器中运行单goroutine程序,那么为了获得最大性能,我需要的逻辑处理器的最小数量是多少。
答案 0 :(得分:6)
没有直接关联。您的应用使用的主题可能小于,等于或大于10。
引自runtime
的包文档:
GOMAXPROCS变量限制了可以同时执行用户级Go代码的操作系统线程数。代表Go在系统调用中可以阻止的线程数没有限制码;那些不计入GOMAXPROCS限制。该软件包的GOMAXPROCS函数可以查询和更改限制。
因此,如果您的应用程序没有启动任何新的goroutine,则线程数将小于10。
如果您的应用启动了许多goroutine(> 10),其中没有任何阻止(例如在系统调用中),则10个操作系统线程将同时执行您的goroutines。
如果您的应用启动了许多goroutine,其中许多(> 10)在系统调用中被阻止,则会生成10个以上的OS线程(但最多只有10个将执行用户级Go代码)。
请参阅此问题以获取示例和详细信息:Why does it not create many threads when many goroutines are blocked in writing file in golang?
编辑(响应您的修改):
我认为GOMAXPROCS
的默认值是逻辑CPU的数量,原因是:因为通常提供最高性能。你可以留下它。一般来说,如果你只有1个goroutine并且你确定你的代码不会产生更多,GOMAXPROCS=1
就足够了,但是你应该测试它,不要对它进行任何改动。