Last updated
Was this helpful?
Last updated
Was this helpful?
如果你没有时间看完这篇文章,这里有一个快速起步的三板斧:
BMC故障导致IPMI
接口无响应,会导致大量ipmitool
监控hang住占用系统资源(目前监控框架已经修改,超过10个ipmitool
进程将不再发器新IMPI监控指令),此时top
显示系统负载极高,同时没有实际CPU占用程序,也没有iowait
,却有一个100%占用CPU的kipmi0
进程。
修复BMC的手段是reset cold
,请依次通过如下方法尝试修复:
在操作系统内执行 ipmitool mc reset cold
- 有一定概率能冷重启BMC
通过移除ipmi
相关内核模块解决kipmi0
占用CPU资源问题:rmmod ipmi_si
- 这个步骤不解决BMC无响应故障,但通过关闭ipmi接口可以解决系统负载问题
终极大招:通过OOB管理服务器向服务器管理IP发送指令ipmitool -I lanplus -H <oob_ip> -U <username> -P <passwd> mc reset cold
冷重启BMC
如果你还有兴趣,请看以下排查故障的过程:
最近遇到用户反馈kvm虚拟机中运行的应用响应缓慢(RT较高),对物理服务器检查,意外发现系统有一个非常高的负载的kipmi0
进程。这个kipmi0
进程是和BMC通讯的,通常应该极少占用资源。
上述故障的特征是:
系统load负载极高,但是应用程序运行占用的CPU资源很低,并且没有iowait
(表明没有磁盘故障)
系统有一个kipmi0
进程接近100%占用了一个CPU资源
检查可以看到这个系统中有大量的ipmitool
进程,显示很多ipmi监控脚本都么有执行完一直卡在系统中,大量消耗系统资源。
选择检查其中一个ipmtool
进程的stat,显示处于轮询等待中
杀掉所有ipmitool
进程可以缓解负载问题
mc reset cold
这个故障现象以前发现过,是因为带外oob控制器死机导致无法响应查询。彻底解决的方法是cold reset带外设备,如果cold reset无效则需要维修带外设备。
如果能够登录服务器,则可以在改服务器操作系统内部执行mc reset cold
。如果幸运地冷重启BMC,则可以看到top
中的 ipmitool0
进程 占用的cpu资源迅速从 100% 降低到0。
如果操作系统内部执行ipmitool
命令会没有响应。则可以尝试卸载ipmi内核模块或者通过带外重启MC
首先可以尝试卸载ipmi内核模块
检查ipmi内核模块
可以看到操作系统使用了如下内核模块
卸载内核模块ipmi_devintf
(针对IPMI驱动的用户端IOCTL接口,每个为这个设备打开文件将绑定到消息处理器message handler作为一个IPMI用户)
此时
kipmi0
负载没有降低
尝试卸载内核模块ipmi_si
(不同系统接口的驱动)
GOOD,可以看到kipmi0
进程的100%负载立即降低到0。
注意:卸载内核模块要按照模块引用计数器来卸载,引用计数为0的模块先卸载,所以先卸载
ipmi_devintf
,ipmi_si
和acpi_ipmi
,然后再卸载ipmi_msghandler
。
继续将所有ipmi
模块都卸载掉
确定所有ipmi
模块都卸载之后,尝试过sudo /etc/init.d/ipmi start
,发现会导致modprobe ipmi_si
进程D住:
说明IPMI驱动接口内核模块无法启动,检查堆栈可以看到sys_init_module
内核函数没有返回
要重新卸载ipmi_si
内核模块,首先要确保这个文件没有打开,否则会提示in use
检查打开到文件句柄
杀掉进程15528
之后查看再查看内核模块
注意:这里虽然看上去ipmi_si
模块已经加载到内核,实际上ipmi0
设备文件初始化没有成功,导致/dev/ipmi0
设备不存在,无法通过ipmitool
进行操作,例如
实际可能硬件存在故障,无法初始化驱动
检查集群中其他服务器的/dev/ipmi0
设备,可以看到
所以尝试在这台故障服务器上手工创建设备文件
尝试使用
sh MAKEDEV ipmi0
提示错误MAKEDEV: MAKEDEV: cannot execute binary file
,没有明白^_^
不过,实践发现内核模块ipmi_si
没有正确加载情况下,即使手工创建/dev/ipmi0
设备文件也无法执行mc reset cold
,报错依旧。
mc reset cold
从带外oob管理机直接oob设备发reset指令。
如果电源状态能够检查到,就说明至少通过网络访问oob是正常的,此时可以尝试通过ipmitool
的lanplus
方式冷启动一下
前面手工mknod ipmi0 c 247 0
创建的设备文件已定要先删除,否则即使mc reset cold
之后再启动service ipmi start
系统日志还会显示报错,并且导致modprobe ipmi_si
进程D住:
实际修复是通过终极大招OOB带外mc reset cold
来修复完成:
操作系统内部由于BMC无响应,所以无法重新加载ipmi_si
内核模块,所以也无法在操作系统内部ipmitool mc reset cold
如果带外能够通过lanplus
接口reset cold
一次BMC,则会恢复操作系统内部和BMC的通讯,所以这个方法修复的可能性较高。
参考 的建议方法,采用卸载ipmi_si
和ipmi_msghandler
可以解决kimpi0
负载高的问题。