记一次解决VMWare虚拟机卡死
最近好几台VMware 虚拟机开机15分钟后卡死,断断续续查了将近半个月。一度想重装虚拟机,但考虑到要重新配置的软件太多了,遂放弃。最后决定还是死磕,终于解决了。
问题描述
VMware 虚拟机,开机后system和软中断占用率逐渐增加,大概15分钟后吃掉所有CPU,系统卡死,虚拟终端无响应,SSH断连,所有服务无响应。虚拟机暂停后resume可以登录系统操作,但过15分钟后依旧卡死。重启系统后依旧有问题。卡死前的top截图如下。
总结
- 解决方法:虚拟机打开
Intel VT-x/EPT
后没有问题了。 - 根本原因:没有找到,可能是Windows升级导致的。
- 感悟:要多思考,根据线索仔细分析可能的问题点,抓log并分析。不是瞎猜。
第一次交手:drm_kms_helper
卡死后再等一会,从虚拟终端能看到一点点kernel的报错log,如下代码块所示。
1
|
Jul 27 09:21:10 (my server name) kernel: [drm:drm_atomic_helper_wait_for_dependencies [drm_kms_helper]] *ERROR* [PLANE:34lane-0] flip_done timed out
|
在网络上寻找答案
用相关的关键字搜索,找到两个解决方法,但是都没有用,还是有问题。
nogui
考虑到kms
和显示有关,所以尝试以nogui
参数启动虚拟机,但是没有用,还是有问题。
删除相关ko
报错log中出现最多的关键字就是kms
,通过lsmod发现有一个名为drm_kms_helper
的模块,非常可疑。
1
|
pk@localhost:~$ lsmod | grep drm
|
在blacklist.conf
把vmwgfx
和drm_kms_helper
加入黑名单,更新kernel,重启系统。但是没有用,还是有问题。
1
|
pk@localhost:~$ tail -2 /etc/modprobe.d/blacklist.conf
|
第二次交手:卸载软件或停止服务
看来不是drm_kms_helper
的问题。考虑到出现问题之后,好像是给confluence装了几个插件。会不会是插件有问题呢?赶紧卸载最近安装的插件,等待,还是有问题。
从top
的输出截图看,有几个java程序的占用率也非常高。考虑到虚拟机跑了非常多的服务,所以把所有的服务都停了,等待,还是有问题。
第三次交手:升级软件
可能是VMWare低版本的一个bug,最近才被打到?现在的版本是16.12,官网的最新版本是16.2.4。赶紧下载最新的版本装上去,等待,还是有问题。
难道是Ubuntu20的一个bug?升级到Ubuntu22试试。考虑到正常工作时间才15分钟左右,可能无法完成升级,所以升级之前拍了一个快照。执行命令do-release-upgrade
进行发现版本升级,中间pause、resume虚拟机好几次,终于升级上去了。升级完毕后重启系统,完蛋,启动失败,rootfs找不到。懒得修了,回滚到Ubuntu20吧。
不要怀疑,apt upgrade
升级所有软件,也还是有问题。
第四次交手:journalctl
实在想不出问题在哪里,用journalctl -b -1
看看上次启动的日志,发现有大量multipathd
的log,很有可能这就是这里了。
1
|
Oct 14 22:15:09 pk.inc multipathd[1032]: sda: failed to get udev uid: Invalid argument
|
参考esx-Server 多路径配置,在/etc/multipath.conf
添加blacklist
,重启服务器。在要准备庆祝的时候,服务器卡死了!!!
1
|
pk@localhost:~$ cat /etc/multipath.conf
|
第五次交手:kenrel
仔细观察最终的top截图,发现sy
和si
的占用率非常高,很有可能问题是出在kernel。也不去猜了,直接硬碰硬,抓trace。
perf top
perf top
可以看到内核函数的占用率,可以精准定位。安装之后,执行perf top
,没有任何输出,虚拟机好像好像还挂了,em…,难受。放弃这个方法。
ftrace
既然si
的占用率高,那就抓一下irq的ftrace。执行下面的命令抓ftrace,待虚拟机卡死后,pause、resume,虚拟机恢复正常,Ctrl-C结束抓取。
1
|
trace-cmd record -e irq
|
用kernelshark
加载trace.dat,发现irq有大段的空白。
只显示一个CPU的事件,随便选取一个空白,CPU0将近27秒没有任何irq,这很不正常。kernel本身应该不会有这么严重bug,难道是CPU的问题?
由于之前开启了Hyper-V,所以虚拟机关闭了Intel VT-x/EPT
。难度是因为这个?赶紧进入控制面板,打开Windows功能,关闭Hyper-V
、Windows虚拟机程序监控平台
、虚拟机平台
,重启电脑。
进入虚拟机的CPU设置,打开Intel VT-x/EPT
,启动虚拟机,静静的等待,完美!!!不再出现卡死的情况,完结撒花!