导读
单位一台R710服务器上线以后出现网卡异常挂掉,奇怪的是只是内网不通,外网接口还是正常的。排查过程一波三折。最后通过上网查资料和打电话咨询DEL技术支持确认是由于DEL网卡驱动的一个bug引起,这个bug在Redhat 5.3 5.4 5.5和Centos系统中存在。
环境介绍
CPU : Xeon E5620 2.4G
内存: 12G
硬盘: 3x450G Raid 5
O S: Centos 5.5 64bit
程序: memcache,Active MQ,LVS
故障经过
问题之----初步出现
新的服务器上线没几天就出现一次服务器不响应的情况,当时因为自己在外面,无法处理,为减少宕机时间直接打电话让机房重启服务器后恢复正常。回到公司马上查看服务器上的监控情况以及日志情况。在日志上没发现啥异常问题,但是监控图上发现一个异常,图片如下图所示:
在故障点swap的使用达到100%,正纳闷,因为上面部署的服务不太可能消耗这么多内存的,总的内存有12G。登录到服务器上,是使用命令free –m发现swap分区的大小为0。怎么可能呢,我安装系统的时候肯定是创建了swap分区的。使用fdisk –l命令查看一下,发现原来分给swap的/dev/sda3竟然是Linux raid autodetect,真是奇怪。起初怀疑是这个问题,因为linux系统当要使用swap而swap分区没有就会导致系统挂掉。于是赶紧先添加一个文件swap,以免再次出现问题,添加步骤如下:
1、 使用dd命令创建一个用于swap分区的16G的文件
dd if=/dev/zero of=/data/tmp/myswap bs=32k count=524288
2、 使用mkswap格式化该文件
mkswap /data/tmpmyswap
3、 启用新建的swap分区文件
swapon /data/tmp/myswap
4、 将该swap分区添加到/etc/fstab自动启动
/data/tmp/myswap swap swap defaults 0 0
临时解决了这个问题,那么是什么原因导致swap分区没添加成功呢?在虚拟机上重新安装了系统,终于发现是我分区的时候不小心选择了swap上面的一个分区,可能是当时操作太快了,于是将/dev/sda3重新格式化成swap分区,并将添加的文件swap去掉,步骤如下:
1、 格式化/dev/sda3为swap
mkswap /dev/sda3
2、 启动swap
swapon /dev/sda3
3、 去掉原来添加的文件swap
swapoff /data/tmp/myswap
4、 添加到/etc/fstab自启动
/dev/sda3 swap swap defaults 0 0
通过以上步骤,服务器上已经有了swap分区了,再使用free –m查看发现Swap为16002M。
问题之----现场体验
本以为问题已经得到解决,但是上周六早上又收到该服务器的报警,报警内容显示该服务器宕机了,这次我在家可以直接现场体验服务器故障情况了,由于那个机器配置有内网和外网,于是首先登录到局域网的一台机器上,ping这台机器的局域网IP不同。接着从我加的电脑ping该机器的公网IP,竟然是通的。通过SecureCRT登录上去使用top命令查看各个指标都正常,奇怪啊,就是内网不通。使用ifdown eth0/ifup eth0重启内网网卡后,再ping内网IP竟然通了,真是奇怪。问题临时解决了。由于不能马上定位问题,而那个服务器非常重要,又不能长时间出问题,因此先写了个脚本,实现功能是如果内网不能连通就重启内网网卡来临时解决这个问题,脚本内容如下:
cat /var/script/monitor_network/monitor_network.sh
#!/bin/bash
packet_lost_status=`ping -i 0.01 -c 20 172.16.88.10 | grep "packet loss" | awk '{{sub(/%/,"",$6)}print $6}'`
if [ $packet_lost_status -gt "95" ];then
echo "`date` restart eth0" >>restart_network.log
/sbin/ifdown eth0
/sbin/ifup eth0
echo "`date` start eth0 ok" >>restart_network.log
fi
问题之----接近真相
有了脚本的保护就可以从容地来排查问题了,目前将问题定位到了eth0内网网卡上面,通过dmesg来诊断没发现eth0网卡有异常,查看/var/log/message也没发现有什么明显的错误。于是想去网上搜索一下看看是否有人和我一样的问题,于是在百度、google中搜索DEL R710 centos网络中断、DEL R710网络中断等关键字,发现了很多朋友遇到过这个问题。很多文章都提到dell的服务器网卡Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet在负载高的情况下会出现无故中断,重启网卡就好了,要更新网卡驱动。登录到服务器查看我的网卡型号,正好是这个型号:eth0: Broadcom NetXtreme II BCM5709 1000Base-T,似乎找到了问题的根源。
还不太放心,又拨通了DEL的技术支持电话4008845117。DEL服务器的技术支持正式目前该网卡在Redhat 5.3、5.4、5.5以及Centos 5.3、5.4、5.5的旧的驱动存在bug,Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet在负载高的情况下会出现无故中断,重启网卡就可以。升级到最新的驱动就能解决该问题,终于确认了问题了,下面就来搞定Centos 5.5 64bit下的网卡驱动升级
问题之----完美解决
下面是详细的Centos 5.5 64bit下的网卡驱动升级的详细流程:
在升级之前先使用命令modinfo bnx2查看一下网卡的驱动版本,升级之前的版本为:2.0.2。
1. 从http://zh-cn.broadcom.com/support/ethernet_nic/netxtremeii.php 下载最新的Broadcom NetXtreme II BCM5706/5708/5709/5716 的linux驱动。
2. yum -y install kernel-devel 安装内核源码(服务器已经安装过了)。
3. 备份之前的驱动:
cp /lib/modules/2.6.18-194.el5/kernel/drivers/net/bnx2.ko /lib/modules/2.6.18-194.el5/kernel/drivers/net/bnx2.ko_bak
4. 安装驱动:
unzip license.zip
cd Server/Linux/Driver
tar xzvf netxtreme2-7.0.36.tar.gz
cd netxtreme2-7.0.36/bnx2/src
make && make install
5. 加载新的驱动
./load_driver.sh
cat load_driver.sh
#!/bin/bash
rmmod bnx2
modprobe bnx2
通过这两个命令来重新加载新的驱动,也可以通过重新启动系统的方式。
升级完成以后,再通过modinfo bnx2命令来查看驱动版本号,版本为:2.1.12b。
至此问题总算解决了!
经验总结
通过这次故障找到了以前没有swap添加所无的隐含问题,从某种意义上要感谢这次故障,不然以后还是会出现问题。获得了Redhat系列和Centos系列对DEL网卡的支持的bug,以后所有linux系统的新服务器上线之前都必须先更新网卡驱动,避免类似的故障发生,影响公司的业务。最后一个经验就是当你对故障无从下手的时候可以多google、baidu,也许会有意外的发现,此外DEL技术支持也是一个相当重要的资源,毕竟他们处理过很多类似的故障有相当的经验。利用好网络和DEL技术支持的资源也许会出现事半功倍的效果。