uber automaxprocs 源码分析
最近直播内部的 golang 服务都使用了 uber 出品的 automaxprocs 这个库。
据伟大的 @ice 马总说,这个库解决了一个困扰B站整个golang(container)技术栈一年多的问题。
出于好奇这个库到底做了什么 magic,能够解决这个持续了一年多的 pain in the ass,抽了一点时间,稍微翻了一下库的源代码,记录如下。
automaxprocs 解决了什么问题
线上容器里的服务通常都对 CPU 资源做了限制,例如默认的 4C。
但是在容器里通过 lscpu
仍然能看到宿主机的所有 CPU 核心:
1 | rchitecture: x86_64 |
这就导致 golang 服务默认会拿宿主机的 CPU 核心数来调用 runtime.GOMAXPROCS()
,导致 P 数量远远大于可用的 CPU 核心,引起频繁上下文切换,影响高负载情况下的服务性能。