是否有必要在完全 cpu 绑定的工作负载中限制 go 例程的数量?
Is it nescessary to limit the number of go routines in an entirely cpu-bound workload?
如果是,如何确定最大值?这对我来说是最重要的部分。我真的很想手动设置它。我考虑过使用 runtime.GOMAXPROCS(0)
,因为我怀疑更多的并行性会产生任何额外的好处。该评论似乎暗示,它在某些时候被标记为弃用。
据我所知,go 例程的唯一限制因素是内存,因为休眠的 go 例程仍然需要内存作为其堆栈。
goroutines 非常轻量级,因此它完全取决于您 运行 所在的系统。在 4GB Ram 中,一个平均进程应该没有问题,少于一百万个并发例程。当然,如果不知道该平台是什么,我们无法回答这是否适用于您的目标平台。
看到this article and this,它们很有用
这不是绝对必要的。默认情况下,这些 goroutines 的线程数 运行 等于机器上的 CPU 核心数(可通过 GOMAXPROCS
配置),因此在线程级别不会发生争用。
但是,由于内存缓存效应,准备好 运行 的 goroutine 较少可能会带来性能优势。例如,在一台 8 核机器上,如果您有 1000 个活动的 goroutine,它们都涉及大量内存,当 goroutine 再次到达 运行 时,所需的内存页面可能已经从您的 CPU缓存。 goroutine 越少,缓存命中的几率就越高。
与性能问题一样:唯一可以确定的方法是使用具有代表性的工作负载自行衡量。
在我们的测试中,我们确定最好生成固定数量的工作例程并使用它们来执行所有工作。 goroutines 的创建和销毁是轻量级的,但并非完全没有开销。如果 goroutines 花费任何时间阻塞,那么这种开销通常是微不足道的。
如果是,如何确定最大值?这对我来说是最重要的部分。我真的很想手动设置它。我考虑过使用 runtime.GOMAXPROCS(0)
,因为我怀疑更多的并行性会产生任何额外的好处。该评论似乎暗示,它在某些时候被标记为弃用。
据我所知,go 例程的唯一限制因素是内存,因为休眠的 go 例程仍然需要内存作为其堆栈。
goroutines 非常轻量级,因此它完全取决于您 运行 所在的系统。在 4GB Ram 中,一个平均进程应该没有问题,少于一百万个并发例程。当然,如果不知道该平台是什么,我们无法回答这是否适用于您的目标平台。
看到this article and this,它们很有用
这不是绝对必要的。默认情况下,这些 goroutines 的线程数 运行 等于机器上的 CPU 核心数(可通过 GOMAXPROCS
配置),因此在线程级别不会发生争用。
但是,由于内存缓存效应,准备好 运行 的 goroutine 较少可能会带来性能优势。例如,在一台 8 核机器上,如果您有 1000 个活动的 goroutine,它们都涉及大量内存,当 goroutine 再次到达 运行 时,所需的内存页面可能已经从您的 CPU缓存。 goroutine 越少,缓存命中的几率就越高。
与性能问题一样:唯一可以确定的方法是使用具有代表性的工作负载自行衡量。
在我们的测试中,我们确定最好生成固定数量的工作例程并使用它们来执行所有工作。 goroutines 的创建和销毁是轻量级的,但并非完全没有开销。如果 goroutines 花费任何时间阻塞,那么这种开销通常是微不足道的。