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等,對系統的內核參數作出邏輯資源上的調整或者對硬件資源升級,以此保障應用系統的安全穩定運行
評論
查看更多