① 在容器里设置GOMAXPROCS的正确姿势
GOMAXPROCS在Go编程中扮演着关键角色,它允许用户调整调度器中的处理器数量。通过设置GOMAXPROCS,可以显著影响Go Runtime的并发性能。在Go 1.5版本后,其默认值与机器的CPU核心数一致(runtime.NumCPU)。了解获取当前机器核心数与GOMAXPROCS值的方法对性能优化至关重要。
容器虚拟化技术,如Docker和Kubernetes,通过cgroup等技术隔离CPU资源。这类技术为容器分配的CPU限制与宿主机的核心数不同,导致runtime.NumCPU()无法准确反映容器可使用的资源。运行时获取的是宿主机的核心数。
不当设置GOMAXPROCS可能导致调度器不必要的线程切换,增加性能开销。在容器环境中,由于受限于容器分配的CPU资源,直接使用runtime.NumCPU()可能导致性能问题。
为解决此问题,Uber提出了一种Workaround方法,利用uber-go/automaxprocs包,动态调整GOMAXPROCS以适应容器分配的CPU限制。这种方法允许在运行时根据cgroup限制数调整处理器数量,优化并发性能。
尽管Go官方目前无明确指导规避这一问题,通过使用如uber-go/automaxprocs的第三方工具,可以在容器环境下更准确地调整GOMAXPROCS,以适应容器的资源限制。