我们知道golang有协程,提供并发应用的性能,在golang 里面通过环境变量 GOMAXPROCS 控制调度器中 Processor(简称P)的数量。每个系统线程必须要绑定 P ,P 才能把 G 交给 M 执行。
因此p的数量会影响 Go runtime 的并发性能,如果 p 的数量大于 CPU 核数,Go调度器不停地进行OS线程切换,就会有频繁的上下文切换成本。从Go 1.5开始, Go的GOMAXPROCS默认值已经设置为CPU的核数, 这允许我们的Go程序充分使用机器的每一个CPU,最大程度的提高我们程序的并发性能。但是现在很多环境都在使用docker这种容器虚拟化技术,通过 cgroup 等技术对 CPU 资源进行隔离,使应用程序无法获取真实分配的 CPU 核心数量。
Uber 开源了一个项目,可以在 Docker 这样使用 cgroup 技术的虚拟化环境换取真实分配的 CPU 核心数量,从而提高应用程序的性能。
参考资料:
https://zhuanlan.zhihu.com/p/377030728
https://pandaychen.github.io/2020/02/28/GOMAXPROCS-POT/