UNIX系统性能监控简述及shell实现系统资源利用率统计程序
论文摘要:本文简要阐述了unix系统中(主要以IBM的AIX为例)进行系统性能管理的几种命令行工具,并通过编写shell实例程序,运用其中提到的工具实现系统资源利用率的统计程序,为做好unix系统管理和调优提供参考。
1.引言
Unix系统中性能优化以及确定系统中的性能瓶颈是系统管理员的主要任务之一。在一个计算机系统中,CPU、内存、硬盘和网络是影响系统性能的主要因素,因此系统性能的监控以及调整也主要在于如何在这些资源中获得某种平衡,以满足人们对系统性能的期望。
IBM小型机RS6000在企业应用中被广泛采用,其上的AIX操作系统如同其它UNIX系统一样,给系统管理员监控系统提供了非常丰富的手段。这里就以AIX系统中的几个监控工具为例,利用shell程序及定时作业程序cron及强大的awk工具,实现统计系统资源利用率,可以每天统计内存的日均使用率、CPU的每日峰值、CPU的日均使用率,并使每月统计量根据月中每日数据平均得出,每月1号凌晨产生上月统计数据,这样就可给系统管理员了解系统运行资源的率用率提供很好的参考。其中提到的系统工具Vmstat、svmon、awk等都很强大,限于篇幅不作非常详细的介绍,如想更透彻地了解这些命令的用法,请参考有关技术资料或手册。
2.AIX中的性能监控工具
一个系统要为用户提供持续高可用性的服务,不仅仅只要求它能够正常运行,而且还要使其性能处于最佳状态。系统管理员的职责之一就是对系统进行性能统计分析,掌握系统的运行状态和资源使用情况,然后通过合理配置系统资源,使系统健康运行。
从系统管理的角度看,性能的管理主要集中在现有资源的分配利用上,这些资源包括物理资源和逻辑资源。物理资源包括了CPU、内存、I/O设备,逻辑设备包括逻辑卷管理器、虚拟内存管理器、系统资源控制器和文件系统等。这里重点介绍一些关于系统性能的命令和工具。
1.iostat
iostat命令主要通过观察物理磁盘的活跃时间以及他们的平均传输速度,监控系统输入/输出设备负载。根据iostat命令产生的报告,用户可确定一个系统配置是否平衡,并据此在物理磁盘与适配器之间更好地平衡输入/输出负载。
2.netpmon
netpmon命令可以监控关于网络行为的系统事件和性能以及网络行为对CPU的消耗。netpmon命令在指定的监控周期报告网络行为。
3.ps 工具
ps命令是UNIX系统中最常见的命令,它主要显示系统中关于进程的统计和状态信息,如进程ID,I/O行为以及CPU利用率等。利用ps命令提供的信息,可决定一个进程运行了多长时间,进程使用了多少CPU时间,以及进程是否受系统的惩罚。还可用ps命令确定进程使用了多少内存,完成多少I/O,进程的优先级以及是谁创建了进程。
4.vmstat
vmstat命令报告关于核心线程,虚拟内存,自陷(trap),磁盘以及CPU行为的统计。而且每种行为报告都被更细致地用百分比分别表示用户态、核态、空闲以及等待磁盘I/O等情况。
内核维持了对核心线程,换页以及中断行为的统计数据,而vmstat命令则通过使用knlist子程序和/dev/kmen伪设备驱动器访问这些数据。磁盘的输入/输出统计是通过设备驱动器维持的。对于磁盘,平均传输速度是通过使用活跃时间核传输信息数目决定的。而活跃时间百分比则是从报告期间驱动器忙的时间量计算出来的。
5.sar
sar命令报告CPU的使用情况,I/O以及其它系统行为。sar命令可以收集,报告以及保存系统行为信息。如果没有指定输入文件,则sar调用sarc命令访问系统数据。
用户可用让cron命令运行两个shell脚本(/usr/lib/sa/sa1和/usr/lib/sa2)以提供日统计和报表。在crontab文件/var/spool/cron/crontabs/adm中包括了一些样本节,用于示范cron要在何时运行这些shell脚本。以这种方式收集到的数据对于确定系统的时间周期特征和决定峰值使用时间是很有用的。
但要注意的是,sar命令自己运行时会产生相当数量的读写。因此最好在没有工作量的情况下运行sar统计,看看sar对总的统计数字有多大的影响。
6.topas
topas命令用于监控各种系统资源,如CPU的使用情况,CPU事件和队列,内存和换页空间的使用,磁盘性能,网络性能以及NFS统计等。它还会报告指派给不同WLM类的进程对系统资源的消耗情况。它还能报告系统中最热门的进程和工作量管理器(WLM)的热门类。有关WLM类信息只有在WLM激活时才会显示。topas命令将热门进程定义为那些使用大量CPU时间的进程。topas命令没有作日志的选项,所有信息都是实时的。
7.truss
truss命令跟踪一个进程的系统调用、所接收的信号以及招致的机器错。要检查的应用程序可在truss命令的命令行中指定,也可将truss命令挂在一个或多个已经在运行的进程上。
8.svmon
svmon命令用于显示当前内存的状态。其可以捕捉和分析虚拟内存的快照信息,所有的统计都是以4k内存页面为单位进行的。
3.系统利用率统计脚本程序
1.统计程序的简介
此系统利用率统计脚本程序由stat.sh、setup.sh组成,仅在AIX 4.3.3与5.2环境中测试通过,尚不支持其他UNIX服务器。推荐将两脚本置于/stat目录,确保root对两文件具有执行权限(cd /stat;chmod 755 *.sh)。可运行setup.sh脚本,此脚本将直接在root的crontab中添加一项。每晚23:55执行stat.sh。脚本默认输出到/tmp/stat目录,result.lst为日均统计值,输出格式为“日期 内存日均使用率% CPU每日峰值% CPU日均使用率%”每月统计量根据月中每日数据平均得出,每月1号凌晨产生上月统计数据并输出至report.lst。脚本中关于crontab、awk的使用说明及shell编程的方法请查阅相关技术文档。
2.setup.sh脚本
在系统的命令行中执行setup.sh,将/stat/stat.sh添加到root用户的cron定时作业项中,添加文件名为/var/spool/cron/crontabs/root。否则报出定时作业已经存在。代码如下:
#!/usr/bin/ksh
FNAME=/stat/stat.sh
CPATH=/var/spool/cron/crontabs/root
[ -f $FNAME ]||(echo "FILE: $FNAME NOT FOUND!";exit 1)
if [ "`grep $FNAME $CPATH`" = "" ];then
echo "55 23 * * * $FNAME > /dev/null 2>&1" >> $CPATH
else
echo "The entry exists in $CPATH !"
fi
3.stat.sh脚本
此脚本使用AIX提供的两个重要系统性能工具vmstat和svmon分别收集cpu和内存的一整天的运行统计数据。为了不影响系统的运行,设定为在定时作业cron中每60秒执行一次,全天24小时运行,并将数据保存到cpu.日期和mem.日期文件中,以便于当天23:55分运行后使用awk工具进行一天的统计计算。
众所周知,awk进行文本处理是逐行处理的,所以只需要设置计数器cnt变量进行累加以便于计算cpu和内存的平均利用率。我们以内存平均利用率的算法进行说明,其他算法的产生与其相类似。
内存平均利用率的算法为:
设置cnt、delta、tbase、base变量初始为零,cnt为行计数变量,delta保存内存使用变化量,tbase为cron时间点上内存使用量,base为总内存量。
从mem.日期文件第一行开始,如果base为0,则将$2、$3域的值赋给base和tbase。然后进行cnt++下一行处理,即将新时间点上的内存使用量减去上一时间点的内存使用量,并将结果赋给delta变量自加:
delta+=$3-tbase
直至最后一行,进行100*(tbase+delta/cnt)/base即可得到当天的内存平均使用率了。
程序的代码如下:
#!/usr/bin/ksh
DDIR=/tmp/stat/data
[ -d $DDIR ]||mkdir -p $DDIR
RFILE=/tmp/stat/result.lst
PFILE=/tmp/stat/report.lst
# get old date
OFILE=`date +%y%m%d`
OMON=`date +%y%m`
# produce report line for yestoday: DATE MEMAVG CPUPEAK CPUAVG
if [ -f ${DDIR}/mem.${OFILE} -a -f ${DDIR}/cpu.${OFILE} ];then
awk 'BEGIN{cnt=0;delta=0;tbase=0;base=0} /^memory/{if(base==0){base=$2;tbase=$3};cnt++;delta+=$3-tbase}END{if(cnt>0)printf("%.1f",100*(tbase+delta/cnt)/base)}' ${DDIR}/mem.${OFILE} | read MEMAVG
awk 'BEGIN{cnt=0;cidmin=100;cidsum=0} /[0-9]$/{if($16
echo $OFILE"\t"$MEMAVG"\t"$CPUPEAK"\t"$CPUAVG >> $RFILE
fi
# wait till tomorrow
NFILE=`date +%y%m%d`
while [ "$OFILE" = "$NFILE" ]
do
sleep 60
NFILE=`date +%y%m%d`
done
# clear the old stat data file
find /tmp/stat/data -type f -ctime +31 | rm -f &
# new stat
vmstat 60 1430 > ${DDIR}/cpu.${NFILE} &
svmon -G -i 60 1430 > ${DDIR}/mem.${NFILE} &
# produce the month report
[ -f $PFILE ]||echo "#MONTH\tMEMAVG\tCPUMAX\tCPUAVG" > $PFILE
if [ `expr $NFILE - $OFILE` -gt 1 -a -f $RFILE ];then
grep ^$OMON $RFILE | awk 'BEGIN{cnt=0;masum=0;cmsum=0;casum=0} {cnt++;masum+=$2;cmsum+=$3;casum+=$4} END{if(cnt>0)printf("%.1f%%\t%.1f%%\t%.1f%%",masum/cnt,cmsum/cnt,casum/cnt)}' | read MAVG CMAX CAVG
echo $OMON"\t"$MAVG"\t"$CMAX"\t"$CAVG >> $PFILE
fi
4.总结
综上所述,在unix系统中,提供了非常强大的系统监控工具。可利用这些工具并结合shell脚本的便利,编制非常方便实用的监控程序,并得到及时详细的系统性能统计信息。系统管理员可根据这些数据,利用系统性能的调制工具,例如fdpr、schedtune、vmtune等,对系统的内核参数作出逻辑资源上的调整或者对硬件资源升级,以此保障应用系统的安全稳定运行
评论
查看更多