快捷搜索:   服务器  安全  linux 安全  MYSQL  dedecms

Unix/Linux 系统: 网络接口带宽管理(2)

    主要字段含义:

    Link Status 链路状态

    Media Speed Selected 选择的连接速度

    Media Speed Running 当前的连接速度

    显示网络接口流量

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

    清单 7. 在 RHEL5.3 系统上查看网络流量

    # cat /proc/net/dev

    Inter-|   Receive                                                |  Transmit

    face |bytes    packets errs drop fifo frame compressed

    multicast|bytes    packets errs drop fifo colls carrier compressed

    lo: 1989443   20172    0    0    0     0          0         0

    1989443   20172    0    0    0     0          0         0

    eth0:      0       0    0    0    0     0          0         0

    0       0    0    0    0     0          0         0

    eth1:17295646453 12338767    0    0     0          0         0      1406

    673360865    6251399    0    0     0          0         0          0

    主要字段含义:

    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 上的输出格式与之类似。

    清单 8. 在 AIX 6.1 系统上查看网络流量

    #  entstat -d ent0|grep -p 'Transmit Statistics'

    Transmit Statistics:                          Receive Statistics:

    --------------------                          -------------------

    Packets: 747906                               Packets: 1205676

    Bytes: 242760179                              Bytes: 398578558

    Interrupts: 0                                 Interrupts: 988774

    Transmit Errors: 0                            Receive Errors: 0

    Packets Dropped: 0                            Packets Dropped: 0

    Bad Packets: 0

    Max Packets on S/W Transmit Queue: 20

    S/W Transmit Queue Overflow: 0

    Current S/W+H/W Transmit Queue Length: 1

    主要字段含义:

    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 的第一部分先进行了初始化,检验并处理输入参数,对未输入的参数指定默认值。

    清单 9. 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}

    接下来, bandmonitor.sh 脚本查询网络接口连接模式和连接速度,对于 AIX 与 Linux 将调用不同的命令。

    清单 10. bandmonitor.sh 脚本查询网络接口连接模式和连接速度

    # ----------------------------------------------------------------

    # 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}

    清单 11 中的脚本按不同操作系统实现了网络流量的监控,并按照网络连接的单工或双工模式计算网络接口带宽占用率,如果占用率超出最初设计的门限值,即发送告警邮件给管理员。

    清单 11. bandmonitor.sh 监控网络接口流量部分

    # ----------------------------------------------------------------

    # 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)

    # 获取网络接口已接收和已发送的字节数

顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论