Go运行时使用的线程数

时间:2016-08-31 09:24:40

标签: multithreading go docker concurrency goroutine

Go运行时(调度程序,垃圾收集器等)可以使用多少个线程?例如,如果GOMAXPROCS10,那么运行时将使用多少个内核线程?

编辑:

我正在阅读the rationale,在Go 1.5中将GOMAXPROCS更改为runtime.NumCPU()。有一句话声称“由于运行时的并行性,特别是垃圾收集器,提升GOMAXPROCS可以提高单个goroutine程序的性能。”

我真正的问题是:如果我在具有CPU配额的Docker容器中运行单goroutine程序,那么为了获得最大性能,我需要的逻辑处理器的最小数量是多少。

1 个答案:

答案 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就足够了,但是你应该测试它,不要对它进行任何改动。