【转载】网络接口带宽管理篇
来源:互联网 发布:淘宝秒杀请输入图片 编辑:程序博客网 时间:2024/09/21 06:34
本文是 Unix/Linux 系统管理自动化系列中的一篇,主要讲述如何实现自动化监控网络接口带宽状态并及时通知系统管理员采取相应措施。
在 Unix/Linux 系统的日常管理工作中,系统管理员可能会遇到因网络接口带宽耗尽而导致网络服务响应过慢,或者服务中断等问题。这些问题较严重的影响了工作效率。因此,关注系统的网络接口使用情况,建立一个警告系统对网络接口带宽的潜在问题发出警告,确保网络接口带宽没有被塞满是系统管理的一个重要的方面。
在本文中,作者介绍了一些查看网络接口使用情况的工具命令并结合这些工具实现了一个自动化监控网络接口带宽的示范脚本。通过介绍,读者将了解如何监视网络接口带宽并以此为依据做出相应的调整。
Unix/Linux 网络接口管理相关命令介绍
获取网络适配器列表信息
在获知网络接口使用状态之前,你可能需要知道你当前的系统使用的网络适配器,在 Linux 和 AIX 中查看网络设备器的属性使用不同的命令,下面的例子给出了在不同系统上如何查看网络设备器的属性。
查看网络接口连接属性
网络接口连接属性包括连接模式、连接速度、链路状态、协商方式等。
Linux 上用于查询及设置以太网卡参数的一个常用命令是 ethtool,它可以获取网卡的各种详细的诊断信息,包括连接模式(全双工 / 半双工)、连接速度(10M/100M/1000M 等)、是否支持自动协商等、链路状态、驱动版本、总线位置等等。ethtool 的查询以及配置功能需要相应网卡设备驱动的支持,从本质上说,ethtool 的功能是调用驱动提供的 ethtool 接口,来实现用户所要求的操作。基本上,Linux 2.4 以上内核的网卡驱动均支持这个命令。但根据具体驱动的不同,显示的信息可能大同小异。
主要字段含义:
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 上使用示例。
- 【转载】网络接口带宽管理篇
- TI_DSP_corePac_带宽管理 - 1.1(优化带宽管理)
- lwip之网络接口管理
- 测试带宽管理
- linux网络接口源码导读(转载)
- linux网络配置&管理基础 [转载]
- Linux 的带宽管理系统
- Linux的带宽管理系统
- 带宽管理的队列规定
- TI_DSP_corePac_带宽管理 - 1(原理)
- TI_DSP_corePac_带宽管理 - 2(举例)
- 网络视频服务器低带宽解决方案
- 匹配 网络 Q值 带宽
- Linux 网络接口管理相关命令介绍
- 网络接口,与网络桥接的管理。
- 转载 内存带宽 百度百科--prefetch相关
- 如何使用snmp计算接口带宽
- android网络编程(httpurlconnect接口,httpclient接口,与socket接口)--转载整理
- 软件文档归类汇总
- 相对路径与绝对路径的若干理解
- shell快捷方式
- 10进制转2进制的函数
- AC尼尔森简介
- 【转载】网络接口带宽管理篇
- Java SE与Java Web的学习
- 【转载】使用 Expect 的自动化登录
- 【转载】网络管理员日志8_Linux下的后门和日志工具
- 新年快乐!
- VIM技巧
- Linux下完成的一个作业程序
- [转]/etc/security/limits.conf解释及应用
- 广播和多播选路