如何在多核计算机上扩展Go例程的数量以获得最大吞吐量

问题描述 投票:0回答:2

在多核计算机上运行,​​我有很多例程在等待CPU密集型任务的通道上等待。为了实现#tasks / second的最大吞吐量,我应该使用的最佳Go例程数是多少。它应该等于核心数量还是与核心数量成正比,还是其他什么?

performance go multicore throughput
2个回答
4
投票

我认为你缺少一点goroutines,它们不是操作系统线程,你不应该关心它们的数量(直到你达到类似百万goroutine的东西)。制作更少或更多的内容几乎不会改变性能,因为Go运行时将负责在实际操作系统线程上安排它们。

实际操作系统线程的数量由GOMAXPROCS控制(您可以使用编程或环境变量进行设置)。它默认为计算机上的核心数。

关键是只在OS线程上调度活动goroutine,而非活动goroutine(就像一个在套接字上等待)没有占用任何CPU资源。


2
投票

由于你的任务是CPU绑定的(而不是IO绑定)你可能不会因为有太多的goroutine而受益(因为它们几乎不会阻塞,它们可能只会在它们之间增加切换开销)。如果您的所有任务几乎在同一时间内完成,那么使用GOMAXPROCS的倍数(goroutines)进行基准测试可能不是一个坏主意。

© www.soinside.com 2019 - 2024. All rights reserved.