Set GOMAXPROCS Properly in Go Program
从 cgroup 的介绍中,我们知道了通过设置 /sys/fs/cgroup/ 的值,并且使用 cgroup-tools 启动程序同时指定一个 cgroup,可以达到控制进程使用系统资源的目的。 起因 一个 Go 程序运行在 k8s 环境中,在某一行代码前后设置 start timestamp 和 end timestamp,发现有时候 p99 的 latency 非常高,正常情况下在 1-3 ms,极端情况下有 50-90 ms。百思不得其解,猜测各种可能加查阅资料后,发现应该是没有正确的设置 runtime.GOMAXPROCS。设置为 1 后,极高 latency 的情况明显减少。 为什么 出现这个问题有三个条件,缺一不可: 是 Go 程序,并且采用系统默认 GOMAXPROCS 运行在 k8s 或者 docker 这样的容器环境 宿主机上有多个 CPU 核 GOMAXPROCS 是什么 回忆一下 Go 并发的 GPM 模型: G代表 goroutine,即用户创建的 goroutines P代表 Logical Processor,是类似于 CPU 核心的概念,其用来控制并发的 M 数量 M是操作系统线程。在绝大多数时候,P的数量和M的数量是相等的。每创建一个P, 就会创建一个对应的M 而 go 的 runtime GOMAXPROCS 代表的就是 P 的数量,其底层就是 runtime 直接调用 Linux 系统调用 sched_getaffinity()...