自动设置 GOMAXPROCS 以匹配 Linux 容器的 CPU 配额 https://github.com/uber-go/automaxprocs
原因:GOMAXPROCS 在 Go 1.5 版本后的默认值是机器的 CPU 核数 (runtime.NumCPU)。而以 Docker 为代表的容器虚拟化技术,会通过 cgroup 等技术对 CPU 资源进行隔离以及以 Kubernetes 为代表的基于容器虚拟化实现的资源管理系统,导致 runtime.NumCPU()
无法正确获取到容器被分配的 CPU 资源数。runtime.NumCPU()
获取的是宿主机的核心数。
设置 GOMAXPROCS 高于真正可使用的核心数后会导致Go调度器不停地进行OS线程切换,从而给调度器增加很多不必要的工作。
现象会就是pod go实际应用的cpu超过limit、request限制,集群会对pod进行cpu限制,导致限制率上升。
参考:https://zhuanlan.zhihu.com/p/377030728