【转载】网络接口带宽管理篇

 
2009 年 9 月 16 日
本文是 Unix/Linux 系统管理自动化系列中的一篇,主要讲述如何实现自动化监控网络接口带宽状态并及时通知系统管理员采取相应措施。

在 Unix/Linux 系统的日常管理工作中,系统管理员可能会遇到因网络接口带宽耗尽而导致网络服务响应过慢,或者服务中断等问题。这些问题较严重的影响了工作效率。因此,关注系统的网络接口使用情况,建立一个警告系统对网络接口带宽的潜在问题发出警告,确保网络接口带宽没有被塞满是系统管理的一个重要的方面。

在本文中,作者介绍了一些查看网络接口使用情况的工具命令并结合这些工具实现了一个自动化监控网络接口带宽的示范脚本。通过介绍,读者将了解如何监视网络接口带宽并以此为依据做出相应的调整。

Unix/Linux 网络接口管理相关命令介绍

获取网络适配器列表信息

在获知网络接口使用状态之前,你可能需要知道你当前的系统使用的网络适配器,在 Linux 和 AIX 中查看网络设备器的属性使用不同的命令,下面的例子给出了在不同系统上如何查看网络设备器的属性。

Linux 系统启动加载网卡驱动会输出识别到的所有网络适配器信息。dmesg 显示系统开机信息。所以可以利用该命令取得系统网络适配器列表。清单 1 命令输出显示共有 2 块网卡,eth0 与 eth1,其中仅 eth1 被启用。
 

查看网络接口连接属性

网络接口连接属性包括连接模式、连接速度、链路状态、协商方式等。

Linux 上用于查询及设置以太网卡参数的一个常用命令是 ethtool,它可以获取网卡的各种详细的诊断信息,包括连接模式(全双工 / 半双工)、连接速度(10M/100M/1000M 等)、是否支持自动协商等、链路状态、驱动版本、总线位置等等。ethtool 的查询以及配置功能需要相应网卡设备驱动的支持,从本质上说,ethtool 的功能是调用驱动提供的 ethtool 接口,来实现用户所要求的操作。基本上,Linux 2.4 以上内核的网卡驱动均支持这个命令。但根据具体驱动的不同,显示的信息可能大同小异。

 
entstat 命令是 AIX 下自带用于查询以太网设备统计信息的工具。它的工作原理与 ethtool 类似,同样是提供给用户一个显示网络设备连接状态的接口。清单 6 为命令在 AIX 6.1 上的运行结果,AIX 5.3 上的输出格式与之一样。

主要字段含义:

Link Status 链路状态

Media Speed Selected 选择的连接速度

Media Speed Running 当前的连接速度

显示网络接口流量

Linux 上,/proc 文件系统提供了大量的信息反映系统的各种运行状态,包括许多网络相关的统计信息。其中文件 /proc/net/dev 实时反映了网络接口的流量信息。清单7显示了 eth1 当前共接收了 17295646453 字节,发送了 673360865 字节。

 

主要字段含义:

bytes 发送或接受的总字节数

packets 发送或接受的报文总数

errs 被设备驱动监测到发送或接受的错误报文总数

drop 由于系统资源限制,被设备驱动丢弃的报文总数

fifo FIFO 缓存错误数

frame 帧错误数

compressed 发送或接受的压缩报数

multicast 接受到的多播报数

colls 接口检测到的冲突数

carrier 连接介质出现故障次数 , 如 : 网线接触不良

AIX 上,entstat enX 显示设备基本的统计信息。entstat -d enX 显示所有统计数据,包括设备特定的统计信息,这部分显示对不同网卡驱动可能不一样, 它可能包含驱动特定的信息和一些未包括在一般统计信息中的扩展统计信息。有些驱动可能没有任何设备特定统计信息。entstat -r enX 会将所有统计数据复位,这个标志只能被特权用户使用。清单 8 为命令在 AIX 6.1 上的运行结果,其中显示 ent0 接收了 398578558 字节,发送了 242760179 字节。AIX 5.3 上的输出格式与之类似。

主要字段含义:

Packets 发送或接受的报文总数

Bytes 发送或接受的总字节数

Interrupts 接受到的硬件中断数

Transmit/Receive Errors 被设备驱动监测到发送或接受的错误报文总数

Packets Dropped 由于系统资源限制,被设备驱动丢弃的报文总数

 

UNIX/Linux 系统网络接口带宽监控自动化脚本示例

前文介绍了 AIX 与 Linux 网络接口带宽监控的手段,本节将结合实例介绍网络接口带宽监控的自动化脚本的设计和实现。

设计思路

1 . 监控指标

监控指标选定为网络接口带宽占用率,即网络接口当前流速占网络接口连接速度的比率,网络接口当前流速可通过一个较短时间间隔内的流量变化除以时间间隔获得。下文将以网络接口带宽利用率为例进行监控脚本的设计。

2 .监控手段

为计算当前流速,脚本需要实时捕获经过网络接口的流量。对于 AIX, 需要调用命令“entstat -d”以获取流量信息;对于 Linux, 需要实时查询文件 /proc/net/dev。调用或查询的时间间隔和总数目可以通过脚本本身的参数指定。

3. 告警机制

一般来说,如果网络接口带宽使用率达到 80% 或 85%, 通常会视为网络接口较忙,脚本将向管理员发送告警邮件。

4 .日志

要保留网络接口流量,告警等原始信息,便于以后进行问题分析、定位。

网络接口带宽分析和告警自动脚本

结合上文设计思路,笔者开发了网络接口带宽分析和告警脚本 bandmonitor.sh, 我们的脚本在 RHEL 5.3、SLES 11、AIX 5.3 和 AIX 6.1 上测试通过。

脚本 bandmonitor.sh 的第一部分先进行了初始化,检验并处理输入参数,对未输入的参数指定默认值。


#!/bin/ksh
 # ==============================================================
 # Script Name:  bandmonitor.sh
 # Desciption:   to monitor bandwidth utilization of specified Ethernet
 # interface
 # Date:         JUNE 15, 2009
 # =============================================================
 # -------------------------------------------------------------
 # Function definitions...                           函数定义
 # -------------------------------------------------------------
 function usage {
    echo ""
    echo "usage: bandmonitor.sh -i interface [ -l LogFile ] /
 [ -s durationseconds ] [ -c count] [ -u Utilization ]"
    echo ""
    echo "For example: bandmonitor.sh -i eth1 -l /tmp/logFile /
 -s 30 -c 200000 -u 80 "
    exit 1
 }

 # ---------------------------------------------------------------
 # Process command-line arguments                  处理命令行参数
 # ---------------------------------------------------------------
 while getopts :i:l:s:u:c: opt
 do
        case "$opt" in
        i) INT="$OPTARG";;
        l) LogFile="$OPTARG";;
        s) SEC="$OPTARG";;
        u) Util="$OPTARG";;
        c) COUNT="$OPTARG";;
        /?) usage;;
        esac
 done
 # ---------------------------------------------------------------
 # Input validation                                   输入校验
 # ---------------------------------------------------------------

 if [ -z "$INT" ]
 then
        echo "error: invalid Augument interface in OPTION -i "
        usage
        exit 1
 fi
 
 # ---------------------------------------------------------------
 # Set values, if unset...                              设置默认值
 # ---------------------------------------------------------------

 # 设置日志文件名
 LogFile=${LogFile:-${INT}.log}
 # 设置查询网络接口流量的时间间隔
 SEC=${SEC:-30}
 # 设置网络接口占用率的门限值
 Util=${Util:-'80'}
 # 设置查询网络接口流量的次数
 COUNT=${COUNT:-172800}
 # ----------------------------------------------------------------
 # Query duplex type and speed              查询连接模式和连接速度
 # ----------------------------------------------------------------
 OS=`uname`
 case "$OS" in
 AIX)
        # 获取网络接口连接速度和连接模式
        Media=`entstat -d ${INT}|grep 'Media Speed Running'`
        DuplexType=`echo $Media|awk '{print $6}'`
        Speed=`echo $Media|awk '{print $4}'`
       
   # 获取启动监控时网络接口接收和发送的字节数
        Traffic=`entstat ${INT}|grep Bytes`
        OLD_TRAN=`echo ${Traffic}|awk '{print $2}'`
        OLD_RECV=`echo ${Traffic}|awk '{print $4}`
        ;;
 Linux)
        # 获取网络接口连接速度和连接模式
   DuplexType=`ethtool ${INT}|grep Duplex|awk '{print $2}`
        Speed=`ethtool ${INT}|grep Speed|awk '{print $2}' /
 |sed 's/Mb//s//`

   # 获取启动监控时网络接口已接收和已发送的字节数
        Traffic=`grep ${INT} /proc/net/dev`
        OLD_TRAN=`echo ${Traffic}|awk '{print $1}'|cut -d: -f2`
        OLD_RECV=`echo ${Traffic}|awk '{print $9}`
        ;;
 *)      echo "not support $OS operating system!"
        exit 1;
        ;;

 esac

 # 在日志文件中记录监测信息,包括启动时间,监测网络接口,接口工作状态和告警门限
 echo "Start to monitor interface ${INT} at `date +%Y%m%d%H%M%S`."  /
 >> ${LogFile}
 echo "Interface ${INT} is working on Duplex:${DuplexType} / Speed:${Speed}." /
       >> ${LogFile}
 echo "Utilization threshold is ${Util} percent." >> ${LogFile}
  # ----------------------------------------------------------------
 # Send admin an alert if bandwidth utilization reach defined threshold
 # 如果带宽利用率达到门限值即发出告警邮件
 #----------------------------------------------------------------

 echo "Network traffic recording....." >> ${LogFile}

 Alarm="NO"
 n=1

 # 计算达到告警门限时所允许通过流量的字节数
 BYTETHRES=`expr ${Speed} /* 1024 /* 1024 /* ${Util} /* ${SEC} / 100`
 while [ n -le $COUNT ]
 do
        case "$OS" in
        AIX)
          # 获取网络接口已接收和已发送的字节数
                Traffic=`entstat ${INT}|grep Bytes`
                Transmit=`echo ${Traffic}|awk '{print $2}'`
                Receive=`echo ${Traffic}|awk '{print $4}`
                ;;
        Linux)
                # 获取网络接口已接收和已发送的字节数
                Traffic=`grep ${INT} /proc/net/dev`
                Transmit=`echo ${Traffic}|awk '{print $1}'|cut -d: -f2`
                Receive=`echo ${Traffic}|awk '{print $9}`
                ;;
        *)      echo "not support $OS operating system!"
                exit 1;
                ;;

        esac

        case "$DuplexType" in
        Full)
               # 连接模式全双工时,需要分别计算发送和接收流量是否超出门限
               if [ `expr $Transmit - $OLD_TRAN` -ge $BYTETHRES ] || /
                [ `expr $Receive - $OLD_RECV` -ge $BYTETHRES ] ;then
                        Alarm="YES"
                fi

                ;;
        Half)
                # 连接模式半双工时,需要合计计算发送和接收流量是否超出门限
                if [ `expr $Transmit - $OLD_TRAN + $Receive - $OLD_RECV` /
                       -ge $BYTETHRES ] ;then
                        Alarm="YES"
                fi

                ;;
        *)      echo "not support Duplex type!"
                exit 1;
                ;;

        esac
  
        # 在日志中记录流量信息
        echo "INT:${INT}        TIME:`date +%Y%m%d%H%M%S`        /
        TRANS:${Transmit}       RECV:${Receive} ALARM:${Alarm}" /
        >> ${LogFile}
      
        # 如果超出告警门限, 给管理员发送告警门限
        if [ $Alarm = "YES" ];then
                echo "INT:${INT}      TIME:`date +%Y%m%d%H%M%S`     /
                TRANS:${Transmit}  RECV:${Receive} ALARM:${Alarm}" /
                >> mail.tmp
                mail -s "Bandwidth Alert" 
root@localhost< mail.tmp
        fi

        # 设置下次循环前重值
        OLD_TRAN=$Transmit
        OLD_RECV=$Receive
        Alarm="NO"
        sleep $SEC
        n=`expr $n + 1`

 done

 exit 0

脚本使用示例

以下为 bandmonitor.sh 脚本在 AIX 上使用示例。

1 .编辑 crontab 文件,每天零点运行一次 bandmonitor.sh 脚本。其中,-s 30,  表示脚本每 30 秒查询并计算网络接口带宽利用率,– c 172800,将查询计算 172800 次,这两个参数保证脚本能运行一天时间, -u 85,表示该接口带宽利用率门限值设为 85%,监控日志可通过– l 参数指定,本例采用默认值,即为 /root/en0.log 文件。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值