【问题标题】:What if GOMAXPROCS is too large?如果 GOMAXPROCS 太大怎么办?
【发布时间】:2019-07-26 07:32:01
【问题描述】:

我们都知道runtime.GOMAXPROCS默认设置为CPU核数,如果这个属性设置过大怎么办?

  1. 程序会有更多的上下文切换吗?
  2. 是否会更频繁地触发垃圾收集器?

【问题讨论】:

  • 这一切都取决于你的代码做了什么,而不是仅仅取决于 GOMAXPROC 的值。

标签: performance go garbage-collection


【解决方案1】:

GOMAXPROCS 默认设置为可用逻辑 CPU 的数量,原因是:这在大多数情况下提供最佳性能。

GOMAXPROCS 仅限制“活动”线程的数量,如果线程的 goroutine 被阻塞(例如,通过系统调用),则可能会启动一个新线程。没有直接关联,请参阅Number of threads used by Go runtime

如果GOMAXPROCS 大于可用 CPU 的数量,那么活动线程将多于 CPU 内核,这意味着活动线程必须“多路复用”到可用处理单元,所以是的,将会有更多上下文切换如果活动线程多于核心,则不一定如此。

垃圾收集与线程数没有直接关系,因此您不必担心。引用包runtime:

GOGC 变量设置初始垃圾回收目标百分比。 当新分配的数据与上次收集后剩余的实时数据的比率达到此百分比时触发收集。默认为 GOGC=100。设置 GOGC=off 完全禁用垃圾收集器。运行时/调试包的 SetGCPercent 函数允许在运行时更改此百分比。见https://golang.org/pkg/runtime/debug/#SetGCPercent

如果您有更多不分配/释放内存的线程,则不会影响触发集合的频率。

在某些情况下,将GOMAXPROCS 设置为高于 CPU 数量会提高应用程序的性能,但这种情况很少见。衡量一下,看看它是否对您有帮助。

【讨论】:

    猜你喜欢
    • 2010-12-18
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    相关资源
    最近更新 更多