服务器维护,服务器代维,安全设置,漏洞扫描,入侵检测服务

dirtysea 发表于 2012-8-17 18:29:21

网络接口带宽管理篇

<DIV>
<BLOCKQUOTE>本文是 Unix/Linux 系统管理自动化系列中的一篇,主要讲述如何实现自动化监控网络接口带宽状态并及时通知系统管理员采取相应措施。</BLOCKQUOTE><!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
<P>在 Unix/Linux 系统的日常管理工作中,系统管理员可能会遇到因网络接口带宽耗尽而导致网络服务响应过慢,或者服务中断等问题。这些问题较严重的影响了工作效率。因此,关注系统的网络接口使用情况,建立一个警告系统对网络接口带宽的潜在问题发出警告,确保网络接口带宽没有被塞满是系统管理的一个重要的方面。</P>
<P>在本文中,作者介绍了一些查看网络接口使用情况的工具命令并结合这些工具实现了一个自动化监控网络接口带宽的示范脚本。通过介绍,读者将了解如何监视网络接口带宽并以此为依据做出相应的调整。</P>
<P><A name=major1><SPAN class=atitle>Unix/Linux 网络接口管理相关命令介绍</SPAN></A></P>
<P><A name=minor1.1><SPAN class=smalltitle><STRONG><FONT face=Arial size=3>获取网络适配器列表信息</FONT></STRONG></SPAN></A></P>
<P>在获知网络接口使用状态之前,你可能需要知道你当前的系统使用的网络适配器,在 Linux 和 AIX 中查看网络设备器的属性使用不同的命令,下面的例子给出了在不同系统上如何查看网络设备器的属性。</P>
<P>Linux 系统启动加载网卡驱动会输出识别到的所有网络适配器信息。dmesg 显示系统开机信息。所以可以利用该命令取得系统网络适配器列表。清单 1 命令输出显示共有 2 块网卡,eth0 与 eth1,其中仅 eth1 被启用。</P><BR><A name=listing1><B>清单 1. 在 RHEL5.3 系统上查看网络适配器</B></A><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>                               
# dmesg|grep -i eth
IBM eHEA ethernet device driver (Release EHEA_0092-03)
ehea: eth0: Jumbo frames are enabled
ehea: eth0 -&gt; logical port id #1
ehea: eth1: Jumbo frames are enabled
ehea: eth1 -&gt; logical port id #2
ehea: eth1: Physical port up
eth1: no IPv6 routers present
</PRE></TD></TR></TBODY></TABLE><BR>
<P>AIX 系统查看系统设备状态使用 lsdev – C 命令。清单 2 为命令在 AIX 6.1 上的输出,AIX 5.3 与之相同。</P><BR><A name=listing2><B>清单 2. 在 AIX 6.1 系统上查看网络适配器</B></A><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>                               
# lsdev -CHc adapter|grep en
name      status    location description

ent0      Available 03-08    2-Port 10/100/1000 Base-TX PCI-X Adapter (14108902)
ent1      Available 03-09    2-Port 10/100/1000 Base-TX PCI-X Adapter (14108902)
ent2      Available 04-08    2-Port 10/100/1000 Base-TX PCI-X Adapter (14108902)
ent3      Available 04-09    2-Port 10/100/1000 Base-TX PCI-X Adapter (14108902)

上面的命令给出了系统可用的网络适配器信息,从上面的输出可以看出,系统有四个可用的网络适配器,
如果要获得网络适配器的配置信息,可以使用 lscfg 来查看。

# lscfg -vl ent0
ent0 U787D.001.992059Y-P1-T12-Port 10/100/1000 Base-TX PCI-X Adapter (14108902)

      2-Port 10/100/1000 Base-TX PCI-X Adapter:
      Network Address.............000D60F42314
      ROM Level.(alterable).......DV0210
      Hardware Location Code......U787D.001.992059Y-P1-T1

可以通过下面命令得到网络接口列表,并可以通过比较 location 获得网络接口与网络适配器的对应关系,
比如接口 en0 对应网络适配器 ent0,因为他们对应相同的 location。

# lsdev -CHc if|grep en
name status    location description

en0Available 03-08    Standard Ethernet Network Interface
en1Available 03-09    Standard Ethernet Network Interface
en2Defined   04-08    Standard Ethernet Network Interface
en3Defined   04-09    Standard Ethernet Network Interface
</PRE></TD></TR></TBODY></TABLE><BR>
<P><A name=minor1.2><SPAN class=smalltitle><STRONG><FONT face=Arial size=3>查看网络接口状态</FONT></STRONG></SPAN></A></P>
<P>网络接口状态包括接口是否启用,是否设置 IP 地址、MTU 大小、收发的包数等,查询的命令为 ifconfig, 在不同操作系统其输出格式略有不同。</P>
<P>清单 3 为在 RHEL5.3 上的输出,其显示两个以太网络接口,eth0 未配置 ip 地址,未被启用;eth1 配置了 IP 地址并被启用。</P><BR><A name=listing3><B>清单 3. 在 RHEL5.3 系统上查看网络接口状态</B></A><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>                               
# ifconfig -a
eth0      Link encap:EthernetHWaddr 00:1A:64:44:AC:34
          BROADCAST MULTICASTMTU:1500Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 b)TX bytes:0 (0.0 b)

eth1      Link encap:EthernetHWaddr 00:1A:64:44:AC:35
          inet addr:9.114.70.151Bcast:9.114.70.255Mask:255.255.255.128
          UP BROADCAST RUNNING MULTICASTMTU:1500Metric:1
          RX packets:12337126 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6250179 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:17295472097 (16.1 GiB)TX bytes:673204981 (642.0 MiB)
lo      Link encap:Local Loopback
          inet addr:127.0.0.1Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNINGMTU:16436Metric:1
          RX packets:20168 errors:0 dropped:0 overruns:0 frame:0
          TX packets:20168 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:1989243 (1.8 MiB)TX bytes:1989243 (1.8 MiB)
</PRE></TD></TR></TBODY></TABLE><BR>
<P>清单 4 为命令在 AIX 6.1 上的运行结果,其显示两个以太网络接口,均配置了 IP 地址并启用。AIX 5.3 上的输出格式与之一样。</P><BR><A name=listing4><B>清单 4. 在 AIX 6.1 系统上查看网络接口状态</B></A><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>                               
# ifconfig – a
en0: flags=5e080863,c0&lt;UP,BROADCAST,NOTRAILERS,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT,
CHECKSUM_OFFLOAD(ACTIVE),PSEG,LARGESEND,CHAIN&gt;
         inet 9.114.124.9 netmask 0xffffff00 broadcast 9.114.124.255
         tcp_sendspace 131072 tcp_recvspace 65536 rfc1323 0
en1: flags=5e080863,c0&lt;UP,BROADCAST,NOTRAILERS,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT,
CHECKSUM_OFFLOAD(ACTIVE),PSEG,LARGESEND,CHAIN&gt;         
         inet 192.168.124.9 netmask 0xffffff00 broadcast 192.168.124.255
         tcp_sendspace 262144 tcp_recvspace 131072 rfc1323 1
lo0: flags=e08084b&lt;UP,BROADCAST,LOOPBACK,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT&gt;
         inet 127.0.0.1 netmask 0xff000000 broadcast 127.255.255.255
      inet6 ::1/0
         tcp_sendspace 131072 tcp_recvspace 131072 rfc1323 1
</PRE></TD></TR></TBODY></TABLE><BR>
<P><A name=minor1.3><SPAN class=smalltitle><STRONG><FONT face=Arial size=3>查看网络接口连接属性</FONT></STRONG></SPAN></A></P>
<P>网络接口连接属性包括连接模式、连接速度、链路状态、协商方式等。</P>
<P>Linux 上用于查询及设置以太网卡参数的一个常用命令是 ethtool,它可以获取网卡的各种详细的诊断信息,包括连接模式(全双工 / 半双工)、连接速度(10M/100M/1000M 等)、是否支持自动协商等、链路状态、驱动版本、总线位置等等。ethtool 的查询以及配置功能需要相应网卡设备驱动的支持,从本质上说,ethtool 的功能是调用驱动提供的 ethtool 接口,来实现用户所要求的操作。基本上,Linux 2.4 以上内核的网卡驱动均支持这个命令。但根据具体驱动的不同,显示的信息可能大同小异。</P><BR><A name=listing5><B>清单 5. 在 RHEL5.3 系统上查看网络适配器连接属性</B></A><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>                               
# ethtool eth1
Settings for eth1:
      Supported ports: [ FIBRE ]
      Supported link modes:   10baseT/Half 10baseT/Full
                              100baseT/Half 100baseT/Full
                              1000baseT/Full
      Supports auto-negotiation: Yes
      Advertised link modes:10000baseT/Full
      Advertised auto-negotiation: Yes
      Speed: 1000Mb/s
      Duplex: Full
      Port: FIBRE
      PHYAD: 0
      Transceiver: internal
      Auto-negotiation: on
      Current message level: 0x000000cc (204)
      Link detected: yes

主要字段含义:
Supported ports                         支持的端口类型
Supported link modes         支持的连接模式
Supports auto-negotiation         是否支持自动协商
Speed                 当前的连接速度
Duplex                 当前的双工状态
Port                 端口类型
Auto-negotiation                         自动协商状态
Link detected                                 链路状态
</PRE></TD></TR></TBODY></TABLE><BR>
<P>entstat 命令是 AIX 下自带用于查询以太网设备统计信息的工具。它的工作原理与 ethtool 类似,同样是提供给用户一个显示网络设备连接状态的接口。清单 6 为命令在 AIX 6.1 上的运行结果,AIX 5.3 上的输出格式与之一样。</P><BR><A name=listing6><B>清单 6. 在 AIX 6.1 系统上查看网络适配器连接属性</B></A><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>                               
# entstat -d ent0|grep -p 'Specific Statistics'
2-Port 10/100/1000 Base-TX PCI-X Adapter (14108902) Specific Statistics:
------------------------------------------------------------------------
Link Status : Up
Media Speed Selected: Auto negotiation
Media Speed Running: 1000 Mbps Full Duplex
PCI Mode: PCI-X (100-133)
PCI Bus Width: 64-bit
Latency Timer: 144
Cache Line Size: 128
Jumbo Frames: Disabled
TCP Segmentation Offload: Enabled
TCP Segmentation Offload Packets Transmitted: 5080
TCP Segmentation Offload Packet Errors: 0
Transmit and Receive Flow Control Status: Enabled
XON Flow Control Packets Transmitted: 0
XON Flow Control Packets Received: 609
XOFF Flow Control Packets Transmitted: 0
XOFF Flow Control Packets Received: 609
Transmit and Receive Flow Control Threshold (High): 49152
Transmit and Receive Flow Control Threshold (Low): 24576
Transmit and Receive Storage Allocation (TX/RX): 8/56
</PRE></TD></TR></TBODY></TABLE><BR>
<P>主要字段含义:</P>
<P>Link Status 链路状态</P>
<P>Media Speed Selected 选择的连接速度</P>
<P>Media Speed Running 当前的连接速度</P>
<P><A name=minor1.4><SPAN class=smalltitle><STRONG><FONT face=Arial size=3>显示网络接口流量</FONT></STRONG></SPAN></A></P>
<P>Linux 上,/proc 文件系统提供了大量的信息反映系统的各种运行状态,包括许多网络相关的统计信息。其中文件 /proc/net/dev 实时反映了网络接口的流量信息。清单7显示了 eth1 当前共接收了 17295646453 字节,发送了 673360865 字节。</P><BR><A name=listing7><B>清单 7. 在 RHEL5.3 系统上查看网络流量</B></A><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>                               
# 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
</PRE></TD></TR></TBODY></TABLE><BR>
<P>主要字段含义:</P>
<P>bytes 发送或接受的总字节数</P>
<P>packets 发送或接受的报文总数</P>
<P>errs 被设备驱动监测到发送或接受的错误报文总数</P>
<P>drop 由于系统资源限制,被设备驱动丢弃的报文总数</P>
<P>fifo FIFO 缓存错误数</P>
<P>frame 帧错误数</P>
<P>compressed 发送或接受的压缩报数</P>
<P>multicast 接受到的多播报数</P>
<P>colls 接口检测到的冲突数</P>
<P>carrier 连接介质出现故障次数 , 如 : 网线接触不良</P>
<P>AIX 上,entstat enX 显示设备基本的统计信息。entstat -d enX 显示所有统计数据,包括设备特定的统计信息,这部分显示对不同网卡驱动可能不一样,<A name=db31c56670jani> 它可能包含驱动特定的信息和一些未包括在一般统计信息中的扩展统计信息。有些驱动可能没有任何设备特定统计信息。entstat -r enX 会将所有统计数据复位,这个标志只能被特权用户使用。清单 8 为命令在 AIX 6.1 上的运行结果,其中显示 ent0 接收了 398578558 字节,发送了 242760179 字节。AIX 5.3 上的输出格式与之类似。</P><BR><A name=listing8><B>清单 8. 在 AIX 6.1 系统上查看网络流量</B></A><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>                               
#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
</PRE></TD></TR></TBODY></TABLE><BR>
<P>主要字段含义:</P>
<P>Packets 发送或接受的报文总数</P>
<P>Bytes 发送或接受的总字节数</P>
<P>Interrupts 接受到的硬件中断数</P>
<P>Transmit/Receive Errors 被设备驱动监测到发送或接受的错误报文总数</P>
<P>Packets Dropped 由于系统资源限制,被设备驱动丢弃的报文总数</P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><IMG height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><BR><IMG height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></TD></TR></TBODY></TABLE>
<TABLE class=no-print cellSpacing=0 cellPadding=0 align=right>
<TBODY>
<TR align=right>
<TD><IMG height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><BR>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD vAlign=center><IMG height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><BR></TD>
<TD vAlign=top align=right><A class=fbox href="http://www.ibm.com/developerworks/cn/aix/library/0909_jiangpeng_netinterface/#main"><B><FONT color=#5c81a7>回页首</FONT></B></A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR><BR>
<P><A name=major2><SPAN class=atitle>UNIX/Linux 系统网络接口带宽监控自动化脚本示例</SPAN></A></P>
<P>前文介绍了 AIX 与 Linux 网络接口带宽监控的手段,本节将结合实例介绍网络接口带宽监控的自动化脚本的设计和实现。</P>
<P><A name=minor2.1><SPAN class=smalltitle><STRONG><FONT face=Arial size=3>设计思路</FONT></STRONG></SPAN></A></P>
<P>1 . 监控指标</P>
<P>监控指标选定为网络接口带宽占用率,即网络接口当前流速占网络接口连接速度的比率,网络接口当前流速可通过一个较短时间间隔内的流量变化除以时间间隔获得。下文将以网络接口带宽利用率为例进行监控脚本的设计。</P>
<P>2 .监控手段</P>
<P>为计算当前流速,脚本需要实时捕获经过网络接口的流量。对于 AIX, 需要调用命令“entstat -d”以获取流量信息;对于 Linux, 需要实时查询文件 /proc/net/dev。调用或查询的时间间隔和总数目可以通过脚本本身的参数指定。</P>
<P>3. 告警机制</P>
<P>一般来说,如果网络接口带宽使用率达到 80% 或 85%, 通常会视为网络接口较忙,脚本将向管理员发送告警邮件。</P>
<P>4 .日志</P>
<P>要保留网络接口流量,告警等原始信息,便于以后进行问题分析、定位。</P>
<P><A name=minor2.2><SPAN class=smalltitle><STRONG><FONT face=Arial size=3>网络接口带宽分析和告警自动脚本</FONT></STRONG></SPAN></A></P>
<P>结合上文设计思路,笔者开发了网络接口带宽分析和告警脚本 bandmonitor.sh, 我们的脚本在 RHEL 5.3、SLES 11、AIX 5.3 和 AIX 6.1 上测试通过。</P>
<P>脚本 bandmonitor.sh 的第一部分先进行了初始化,检验并处理输入参数,对未输入的参数指定默认值。</P><BR><A name=listing9><B>清单 9. bandmonitor.sh 脚本初始化部分</B></A><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>                               
#!/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}
</PRE></TD></TR></TBODY></TABLE><BR>
<P>接下来, bandmonitor.sh 脚本查询网络接口连接模式和连接速度,对于 AIX 与 Linux 将调用不同的命令。</P><BR><A name=listing10><B>清单 10. bandmonitor.sh 脚本查询网络接口连接模式和连接速度</B></A><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>                               
# ----------------------------------------------------------------
# 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`."\
&gt;&gt; ${LogFile}
echo "Interface ${INT} is working on Duplex:${DuplexType} \ Speed:${Speed}." \
       &gt;&gt; ${LogFile}
echo "Utilization threshold is ${Util} percent." &gt;&gt; ${LogFile}
</PRE></TD></TR></TBODY></TABLE><BR>
<P>清单 11 中的脚本按不同操作系统实现了网络流量的监控,并按照网络连接的单工或双工模式计算网络接口带宽占用率,如果占用率超出最初设计的门限值,即发送告警邮件给管理员。</P><BR><A name=listing11><B>清单 11. bandmonitor.sh 监控网络接口流量部分</B></A><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>                               
# ----------------------------------------------------------------
# Send admin an alert if bandwidth utilization reach defined threshold
# 如果带宽利用率达到门限值即发出告警邮件
#----------------------------------------------------------------

echo "Network traffic recording....." &gt;&gt; ${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}" \
      &gt;&gt; ${LogFile}
      
      # 如果超出告警门限, 给管理员发送告警门限
      if [ $Alarm = "YES" ];then
                echo "INT:${INT}      TIME:`date +%Y%m%d%H%M%S`   \
                TRANS:${Transmit}RECV:${Receive} ALARM:${Alarm}" \
                &gt;&gt; mail.tmp
                mail -s "Bandwidth Alert"root@localhost&lt; mail.tmp
      fi

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

done

exit 0
</PRE></TD></TR></TBODY></TABLE><BR>
<P><A name=minor2.3><SPAN class=smalltitle><STRONG><FONT face=Arial size=3>脚本使用示例</FONT></STRONG></SPAN></A></P>
<P>以下为 bandmonitor.sh 脚本在 AIX 上使用示例。</P>
<P>1 .编辑 crontab 文件,每天零点运行一次 bandmonitor.sh 脚本。其中,-s 30,  表示脚本每 30 秒查询并计算网络接口带宽利用率,– c 172800,将查询计算 172800 次,这两个参数保证脚本能运行一天时间, -u 85,表示该接口带宽利用率门限值设为 85%,监控日志可通过– l 参数指定,本例采用默认值,即为 /root/en0.log 文件。</P><BR><A name=listing12><B>清单 12. 编辑 crontab</B></A><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>                               
&gt; crontab – e
# start to monitor bandwidth of interface en0 every 0 o ’ clock
0 0 * * * /root/bandmonitor.sh -i en0 – s 30 – c 172800 – u 85 \
&gt;/tmp/bandmonitor.out 2&gt;&amp;1
</PRE></TD></TR></TBODY></TABLE><BR>
<P>2 .用户收到告警邮件,需要进一步查询历史记录时,可查看日志文件。</P><BR><A name=listing13><B>清单 13. 查看日志文件</B></A><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>                               
c209f7n16:/root # cat eth0.log|more
Start to monitor interface eth0 at 20090721074128.
Interface eth0 is working on Duplex:Half Speed:100.
Utilization threshold is 80 percent.
Network traffic recording.....
INT:eth0   TIME:20090721074128   TRANS:570460766 RECV:28919401   ALARM:NO
INT:eth0    TIME:20090721074158   TRANS:570462132 RECV:28923747   ALARM:NO
INT:eth0    TIME:20090721074228   TRANS:570463752 RECV:28925435   ALARM:NO
</PRE></TD></TR></TBODY></TABLE><BR><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><IMG height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><BR><IMG height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></TD></TR></TBODY></TABLE>
<TABLE class=no-print cellSpacing=0 cellPadding=0 align=right>
<TBODY>
<TR align=right>
<TD><IMG height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><BR>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD vAlign=center><IMG height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><BR></TD>
<TD vAlign=top align=right><A class=fbox href="http://www.ibm.com/developerworks/cn/aix/library/0909_jiangpeng_netinterface/#main"><B><FONT color=#5c81a7>回页首</FONT></B></A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR><BR>
<P><A name=major3><SPAN class=atitle>小结</SPAN></A></P>
<P>本文介绍了 Unix/Linux 上的网络接口带宽管理命令并通过一个自动化监控脚本详细介绍了如何实现网络接口带宽的自动化监控管理。网络接口带宽的自动化监控能帮助系统管理员及时发现网络接口带宽的异常问题,通过采取相应的措施使得问题得以消除和缓解。</P></DIV>
页: [1]
查看完整版本: 网络接口带宽管理篇