最近升级了一些Ubuntu的云主机内核,发现系统负载比未升级前高很多,但是物理机升级到此版本则没有问题。

一台跑了7个java程序的云主机,升级前负载基本在1左右,升级后负载跑到7左右,但是CPU基本是一点也不高,回滚内核版本一切又正常了。

经过多次实验,发现官方几个版本内核确实存在问题:

4.15.0-70 GOOD
4.15.0-72 BAD
4.15.0-73 BAD
4.15.0-74 BAD

5.0.0-36 GOOD
5.0.0-37 BAD

以上测试用一台新云主机啥也不跑,GOOD内核负载0.00左右,BAD内核负载 0.6左右。

尝试安装主线内核 5.4.6-050406,结果是GOOD,可见问题主线内核已经修复掉了。

再尝试官方的HWE内核 5.3.0-24 结果还是GOOD,解决,基本可以收工了。

实际上最近云主机负载问题还有一起(下回说),厂商正在排查,我想既然找到具体版本,不如查一下是哪个补丁的问题吧。

先多找了两家大厂测试,发现问题可以重现,应该不是个别厂商的虚拟化平台问题,翻了下开始出问题的内核补丁,太多了,这块也不熟悉, 干脆两分法逐一排查,经过几十次的内核编译重启,最终找到引入问题的补丁: x86/timer: Skip PIT initialization on modern chipsets

然后以此为突破口找到了修复补丁: x86/timer: Force PIT initialization when !X86_FEATURE_ARAT

真相大白,QEMU/KVM才会中招,一开始我还觉得是厂商热补CPU bug导致的:)