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