案例9、监控网卡流量

曾经遇到过一个很奇怪的问题,一台服务器运行一段时间后网卡流量变为0,就是说网卡没法传输数据了。可是重启网络服务后恢复正常,形成该问题的缘由多是系统内核的问题,也多是网卡硬件的问题。python

当时解决的思路是,先尝试从新安装操做系统,看问题是否能够解决,若是问题依然存在而后尝试更换网卡。因为服务器上的业务不能中断,因此重装操做系统或者更换网卡都没法在近期实现。临时解决办法是写一个shell脚本监控网卡流量,当流量为0时,重启网络服务。shell

需求以下:centos

1)一分钟监控一次网卡流量bash

2)当网卡流量为0时,重启网卡服务器

3)假设网卡名字为eth0网络


知识点一:查看网卡流量运维

在案例八中,使用了sar -n DEV查看网卡流量,其实还有一种更直观的方法,使用nload命令查看网卡流量。要使用该工具,须要安装nload包,在centos系统中,须要先安装epel-release包。 tcp

若是想要查看另外一块网卡的流量,按一下右方向键便可。使用nload -m能够同时显示所有网卡的实时流量。可是,nload这个工具在shell脚本中没法使用,由于它是动态的。ide

# nload
Device ens33 [192.168.93.130] (1/2):
====================================================
Incoming:
          Curr: 944.00 Bit/s
          Avg: 1.12 kBit/s
          Min: 944.00 Bit/s
          Max: 1.86 kBit/s
          Ttl: 15.59 MByte
Outgoing:
          Curr: 8.58 kBit/s
          Avg: 8.44 kBit/s
          Min: 4.27 kBit/s
          Max: 9.03 kBit/s
          Ttl: 1.05 MByte


知识点二:重启网络服务工具

centos系统中,查看网卡和ip的命令是ip addr,网卡配置文件所在路径为:/etc/sysconfig/network-scripts/,在这个目录下有几个带有网卡名字的配置文件,例如ifcfg-ens33,ifcfg-lo。要想更改IP地址,修改对应的配置文件便可,修改完后须要重启网络服务才能生效:

# systemctl restart network       //centos7系统

若是是centos6系统,命令为:

# service network restart

也能够单独重启指定网卡,例如:

# ifdown ens33 && ifup ens33


知识点三:抓包

在平时平常运维工做中,若是流量异常(一般是流量变大),须要咱们分析究竟是什么样的流量,能够用抓包工具用来完成该需求。在centos系统里有一个经常使用的抓包工具tcpdump,若系统没有这个命令,安装一下tcpdump包。

经常使用的用法是:

# tcpdump -nn -i eth0 -c 100

说明:

-nn:以数字的形式显示IP和Port;

-i:指定网卡名字;

-c:指定抓包数量。

该用法在屏幕上显示数据包的流向,即显示来源IP、端口和目标IP、端口。要想抓到真正的数据包,须要加上-w选项。

# tcpdump -nn -i eth0 -c 100 -w /tmp/1.cap

这样会抓100个数据包存入到/tmp/1.cap里,这个文件是二进制的,能够用Windows版的wireshark工具(图形化)查看也能够用tcpdump查看:

# tcpdunp -r /tmp/1.cap

另外,tcpdump也能够指定IP、port及协议:

# tcpdump -nn tcp and host 1.1.1.1 and port 80


知识点四:if判断多个条件

在shell脚本中,if判断条件常常会有多个,要么同时知足要么只知足一个。用法以下:

# if [ option1 -a option2 ]     //同时知足option1和option2
# if [ option1 ] && [ option2 ]   //同时知足option1和option2
# if [ option1 -o option2 ]      //知足option1或option2
# if [ option1 ] || [ option2 ]   //知足option1或option2


本案例参考脚本

#!/bin/bash
#监控网卡流量,当流量为0,重启网卡
#做者:
#日期:
#版本:v0.2
#设定语言为英文
LANG=en
#断定系统是否已经安装sysstat包,该包里有sar命令
if ! rpm -q sysstat &>/dev/null
then
    yum install -y sysstat
fi
#将10秒的网卡流量写入到一个临时文件里
sar -n DEV 1 10 |grep 'ens33' > /tmp/ens33_sar.log
#入口网卡流量
net_in=`grep '^Average:' /tmp/ens33_sar.log|awk '{print $5}'`
#出口网卡流量
net_out=`grep '^Average:' /tmp/ens33_sar.log|awk '{print $6}'`
#当入口和出口流量同时为0时,说明网卡异常
if [ $net_in == "0.00" -a $net_out == "0.00" ]
then
    echo "`date` ens33网卡出现异常,重启网卡。">> /tmp/net.log
    ifdown ens33 && ifup ens33
fi

一分钟执行一次,写一个任务计划便可。


需求扩展

网卡出问题,流量跌为0的状况很是罕见,但流量忽然大幅增涨的状况却是很广泛。如今的需求是,当网卡(eth0)流量增幅超过1倍时须要抓1000个数据包存入一个以日期、时间为名字的文件中,而且须要发邮件给admin@admin.com(不考虑告警收敛)。

参考脚本以下:

#!/bin/bash
#监控网卡流量增幅超过一倍告警
#做者:
#日期:
#版本:v0.1
mail_user=admin@admin.com
dir=/tmp/netlog
[ -d $dir ] || mkdir $dir
s_m=`lsattr -d $dir|awk '{print $1}' |sed 's/[^a]//g'`
if [ $s_m != "a" ]
then
    chattr +a $dir
fi
if ! rpm -q sysstat &>/dev/null
then
    yum install -y sysstat
fi
sar -n DEV 1 10 |grep 'ens33' > /tmp/ens33_sar.log
net_in=`grep '^Average:' /tmp/ens33_sar.log|awk '{print $5}'`
net_out=`grep '^Average:' /tmp/ens33_sar.log|awk '{print $6}'`
if [ ! -f $dir/net.log ]
then
    echo "net_in $net_in" >> $dir/net.log
    echo "net_out $net_out" >> $dir/net.log
    exit 0
fi
net_in_last=`tail -2 $dir/net.log|grep 'net_in'`
net_out_last=`tail -2 $dir/net.log|grep 'net_out'`
net_in_diff=`$[$net_in-$net_in_last]`
net_out_diff=`$[$net_out-$net_out_last]`
if [ $net_in_diff -gt $net_in_last ]
then
    python mail.py $mail_user "网卡入口流量增幅异常" "增幅$net_in_diff"
    #这里的mail.py参考案例二的知识点四
fi
if [ $net_out_diff -gt $net_out_last ]
then
    python mail.py $mail_user "网卡出口流量增幅异常" "增幅$net_out_diff"
fi
echo "net_in $net_in" >> $dir/net.log
echo "net_out $net_out" >> $dir/net.log
相关文章
相关标签/搜索