背景:服务迁移到容器
容器内获取CPU核数的坑
早期的JDK版本中,Jdk1.8u102,当你使用Java的Runtime获取CPU数量时,在容器里面会返回容器所在宿主机的核数,而不是容器自身的:
|
|
解决方案: 这其实是JDK的一个问题,已经trace在JDK-8140793,原因是获取CPU核数是通过读取两个环境变量,其中
ENV | Description |
---|---|
_SC_NPROCESSORS_CONF | number of processors configured |
_SC_NPROCESSORS_ONLN | The number of processors currently online (available) |
其中_SC_NPROCESSORS_CONF 就是我们需要容器真实的CPU数量。
- 第一种办法是使用新版本的Jdku191以上的版本
- 第二种办法是使用自编译上面的源代码,通过LD_PRLOAD的方式将修改后的so文件加载进去Mock掉CPU的核数
参考链接
https://aijishu.com/a/1060000000006797