fum*_*007 9 concurrency multithreading go goroutine docker
Go运行时(调度程序,垃圾收集器等)可以使用多少个线程?例如,如果GOMAXPROCS是10,那么运行时将使用多少个内核线程?
我读的理由改变GOMAXPROCS对runtime.NumCPU()围棋1.5.有一句话声称"单个goroutine程序的性能可以通过提高GOMAXPROCS运行时的并行性来提高,特别是垃圾收集器."
我真正的问题是:如果我在具有CPU配额的Docker容器中运行单goroutine程序,那么为了获得最大性能,我需要的逻辑处理器的最小数量是多少.
icz*_*cza 10
没有直接关联.您的应用使用的主题可能小于,等于或大于10.
引用包文档runtime:
GOMAXPROCS变量限制了可以同时执行用户级Go代码的操作系统线程数.代表Go代码在系统调用中可以阻塞的线程数没有限制; 那些不计入GOMAXPROCS限制.该软件包的GOMAXPROCS函数查询并更改限制.
因此,如果您的应用程序没有启动任何新的goroutine,则线程数将小于10.
如果您的应用程序启动了许多goroutine(> 10),其中没有任何阻塞(例如在系统调用中),10个操作系统线程将同时执行您的goroutines.
如果您的应用程序启动了许多goroutine,其中许多(> 10)在系统调用中被阻止,则将生成超过10个OS线程(但最多只有10个将执行用户级Go代码).
有关示例和详细信息,请参阅此问题:为什么在golang中写入文件时阻止了许多goroutine时,它不会创建多个线程?
编辑(响应您的编辑):
我认为默认值GOMAXPROCS是逻辑CPU的数量有一个原因:因为通常提供最高性能.你可以留下它.一般来说,如果你只有1个goroutine并且你确定你的代码不会产生更多,GOMAXPROCS=1那就足够了,但是你应该测试并且不要对它采取任何措辞.