记一次解决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
 

在网络上寻找答案

用相关的关键字搜索,找到两个解决方法,但是都没有用,还是有问题。

  1. 降低kernel版本到5.4.0-122,参考
  2. 更改kernel启动参数,参考

nogui

考虑到kms和显示有关,所以尝试以nogui参数启动虚拟机,但是没有用,还是有问题。

删除相关ko

报错log中出现最多的关键字就是kms,通过lsmod发现有一个名为drm_kms_helper的模块,非常可疑。

1
2
3
4
pk@localhost:~$ lsmod | grep drm
drm_kms_helper 184320 1 vmwgfx
syscopyarea 16384 1 drm_kms_helper
sysfillrect 16384 1 drm_kms_helper
 

blacklist.confvmwgfxdrm_kms_helper加入黑名单,更新kernel,重启系统。但是没有用,还是有问题。

1
2
3
4
5
pk@localhost:~$ tail -2 /etc/modprobe.d/blacklist.conf
blacklist vmwgfx
blacklist drm_kms_helper
pk@localhost:~$ sudo update-initramfs -u
pk@localhost:~$ sudo reboot
 

第二次交手:卸载软件或停止服务

看来不是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
2
3
4
5
6
7
Oct 14 22:15:09 pk.inc multipathd[1032]: sda: failed to get udev uid: Invalid argument
Oct 14 22:15:09 pk.inc multipathd[1032]: sda: failed to get sysfs uid: Invalid argument
Oct 14 22:15:09 pk.inc multipathd[1032]: sda: failed to get sgio uid: No such file or directory
Oct 14 22:15:10 pk.inc multipathd[1032]: sdb: add missing path
Oct 14 22:15:10 pk.inc multipathd[1032]: sdb: failed to get udev uid: Invalid argument
Oct 14 22:15:10 pk.inc multipathd[1032]: sdb: failed to get sysfs uid: Invalid argument
Oct 14 22:15:10 pk.inc multipathd[1032]: sdb: failed to get sgio uid: No such file or directory
 

参考esx-Server 多路径配置,在/etc/multipath.conf添加blacklist,重启服务器。在要准备庆祝的时候,服务器卡死了!!!

1
2
3
4
5
6
7
8
pk@localhost:~$ cat /etc/multipath.conf
defaults {
user_friendly_names yes
}
blacklist {
devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
devnode "^sd[a-z]?[0-9]*"
}
 

第五次交手:kenrel

仔细观察最终的top截图,发现sysi的占用率非常高,很有可能问题是出在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-VWindows虚拟机程序监控平台虚拟机平台,重启电脑。

进入虚拟机的CPU设置,打开Intel VT-x/EPT,启动虚拟机,静静的等待,完美!!!不再出现卡死的情况,完结撒花!

posted @ 2023-11-21 15:19  羊脂玉净瓶  阅读(2596)  评论(0编辑  收藏  举报