UNIX系統(tǒng)性能監(jiān)控簡(jiǎn)述及shell實(shí)現(xiàn)系統(tǒng)資源利用率
UNIX系統(tǒng)性能監(jiān)控簡(jiǎn)述及shell實(shí)現(xiàn)系統(tǒng)資源利用率統(tǒng)計(jì)程序
論文摘要:本文簡(jiǎn)要闡述了unix系統(tǒng)中(主要以IBM的AIX為例)進(jìn)行系統(tǒng)性能管理的幾種命令行工具,并通過(guò)編寫shell實(shí)例程序,運(yùn)用其中提到的工具實(shí)現(xiàn)系統(tǒng)資源利用率的統(tǒng)計(jì)程序,為做好unix系統(tǒng)管理和調(diào)優(yōu)提供參考。
1.引言
Unix系統(tǒng)中性能優(yōu)化以及確定系統(tǒng)中的性能瓶頸是系統(tǒng)管理員的主要任務(wù)之一。在一個(gè)計(jì)算機(jī)系統(tǒng)中,CPU、內(nèi)存、硬盤和網(wǎng)絡(luò)是影響系統(tǒng)性能的主要因素,因此系統(tǒng)性能的監(jiān)控以及調(diào)整也主要在于如何在這些資源中獲得某種平衡,以滿足人們對(duì)系統(tǒng)性能的期望。
IBM小型機(jī)RS6000在企業(yè)應(yīng)用中被廣泛采用,其上的AIX操作系統(tǒng)如同其它UNIX系統(tǒng)一樣,給系統(tǒng)管理員監(jiān)控系統(tǒng)提供了非常豐富的手段。這里就以AIX系統(tǒng)中的幾個(gè)監(jiān)控工具為例,利用shell程序及定時(shí)作業(yè)程序cron及強(qiáng)大的awk工具,實(shí)現(xiàn)統(tǒng)計(jì)系統(tǒng)資源利用率,可以每天統(tǒng)計(jì)內(nèi)存的日均使用率、CPU的每日峰值、CPU的日均使用率,并使每月統(tǒng)計(jì)量根據(jù)月中每日數(shù)據(jù)平均得出,每月1號(hào)凌晨產(chǎn)生上月統(tǒng)計(jì)數(shù)據(jù),這樣就可給系統(tǒng)管理員了解系統(tǒng)運(yùn)行資源的率用率提供很好的參考。其中提到的系統(tǒng)工具Vmstat、svmon、awk等都很強(qiáng)大,限于篇幅不作非常詳細(xì)的介紹,如想更透徹地了解這些命令的用法,請(qǐng)參考有關(guān)技術(shù)資料或手冊(cè)。
2.AIX中的性能監(jiān)控工具
一個(gè)系統(tǒng)要為用戶提供持續(xù)高可用性的服務(wù),不僅僅只要求它能夠正常運(yùn)行,而且還要使其性能處于最佳狀態(tài)。系統(tǒng)管理員的職責(zé)之一就是對(duì)系統(tǒng)進(jìn)行性能統(tǒng)計(jì)分析,掌握系統(tǒng)的運(yùn)行狀態(tài)和資源使用情況,然后通過(guò)合理配置系統(tǒng)資源,使系統(tǒng)健康運(yùn)行。
從系統(tǒng)管理的角度看,性能的管理主要集中在現(xiàn)有資源的分配利用上,這些資源包括物理資源和邏輯資源。物理資源包括了CPU、內(nèi)存、I/O設(shè)備,邏輯設(shè)備包括邏輯卷管理器、虛擬內(nèi)存管理器、系統(tǒng)資源控制器和文件系統(tǒng)等。這里重點(diǎn)介紹一些關(guān)于系統(tǒng)性能的命令和工具。
1.iostat
iostat命令主要通過(guò)觀察物理磁盤的活躍時(shí)間以及他們的平均傳輸速度,監(jiān)控系統(tǒng)輸入/輸出設(shè)備負(fù)載。根據(jù)iostat命令產(chǎn)生的報(bào)告,用戶可確定一個(gè)系統(tǒng)配置是否平衡,并據(jù)此在物理磁盤與適配器之間更好地平衡輸入/輸出負(fù)載。
2.netpmon
netpmon命令可以監(jiān)控關(guān)于網(wǎng)絡(luò)行為的系統(tǒng)事件和性能以及網(wǎng)絡(luò)行為對(duì)CPU的消耗。netpmon命令在指定的監(jiān)控周期報(bào)告網(wǎng)絡(luò)行為。
3.ps 工具
ps命令是UNIX系統(tǒng)中最常見的命令,它主要顯示系統(tǒng)中關(guān)于進(jìn)程的統(tǒng)計(jì)和狀態(tài)信息,如進(jìn)程ID,I/O行為以及CPU利用率等。利用ps命令提供的信息,可決定一個(gè)進(jìn)程運(yùn)行了多長(zhǎng)時(shí)間,進(jìn)程使用了多少CPU時(shí)間,以及進(jìn)程是否受系統(tǒng)的懲罰。還可用ps命令確定進(jìn)程使用了多少內(nèi)存,完成多少I/O,進(jìn)程的優(yōu)先級(jí)以及是誰(shuí)創(chuàng)建了進(jìn)程。
4.vmstat
vmstat命令報(bào)告關(guān)于核心線程,虛擬內(nèi)存,自陷(trap),磁盤以及CPU行為的統(tǒng)計(jì)。而且每種行為報(bào)告都被更細(xì)致地用百分比分別表示用戶態(tài)、核態(tài)、空閑以及等待磁盤I/O等情況。
內(nèi)核維持了對(duì)核心線程,換頁(yè)以及中斷行為的統(tǒng)計(jì)數(shù)據(jù),而vmstat命令則通過(guò)使用knlist子程序和/dev/kmen偽設(shè)備驅(qū)動(dòng)器訪問(wèn)這些數(shù)據(jù)。磁盤的輸入/輸出統(tǒng)計(jì)是通過(guò)設(shè)備驅(qū)動(dòng)器維持的。對(duì)于磁盤,平均傳輸速度是通過(guò)使用活躍時(shí)間核傳輸信息數(shù)目決定的。而活躍時(shí)間百分比則是從報(bào)告期間驅(qū)動(dòng)器忙的時(shí)間量計(jì)算出來(lái)的。
5.sar
sar命令報(bào)告CPU的使用情況,I/O以及其它系統(tǒng)行為。sar命令可以收集,報(bào)告以及保存系統(tǒng)行為信息。如果沒有指定輸入文件,則sar調(diào)用sarc命令訪問(wèn)系統(tǒng)數(shù)據(jù)。
用戶可用讓cron命令運(yùn)行兩個(gè)shell腳本(/usr/lib/sa/sa1和/usr/lib/sa2)以提供日統(tǒng)計(jì)和報(bào)表。在crontab文件/var/spool/cron/crontabs/adm中包括了一些樣本節(jié),用于示范cron要在何時(shí)運(yùn)行這些shell腳本。以這種方式收集到的數(shù)據(jù)對(duì)于確定系統(tǒng)的時(shí)間周期特征和決定峰值使用時(shí)間是很有用的。
但要注意的是,sar命令自己運(yùn)行時(shí)會(huì)產(chǎn)生相當(dāng)數(shù)量的讀寫。因此最好在沒有工作量的情況下運(yùn)行sar統(tǒng)計(jì),看看sar對(duì)總的統(tǒng)計(jì)數(shù)字有多大的影響。
6.topas
topas命令用于監(jiān)控各種系統(tǒng)資源,如CPU的使用情況,CPU事件和隊(duì)列,內(nèi)存和換頁(yè)空間的使用,磁盤性能,網(wǎng)絡(luò)性能以及NFS統(tǒng)計(jì)等。它還會(huì)報(bào)告指派給不同WLM類的進(jìn)程對(duì)系統(tǒng)資源的消耗情況。它還能報(bào)告系統(tǒng)中最熱門的進(jìn)程和工作量管理器(WLM)的熱門類。有關(guān)WLM類信息只有在WLM激活時(shí)才會(huì)顯示。topas命令將熱門進(jìn)程定義為那些使用大量CPU時(shí)間的進(jìn)程。topas命令沒有作日志的選項(xiàng),所有信息都是實(shí)時(shí)的。
7.truss
truss命令跟蹤一個(gè)進(jìn)程的系統(tǒng)調(diào)用、所接收的信號(hào)以及招致的機(jī)器錯(cuò)。要檢查的應(yīng)用程序可在truss命令的命令行中指定,也可將truss命令掛在一個(gè)或多個(gè)已經(jīng)在運(yùn)行的進(jìn)程上。
8.svmon
svmon命令用于顯示當(dāng)前內(nèi)存的狀態(tài)。其可以捕捉和分析虛擬內(nèi)存的快照信息,所有的統(tǒng)計(jì)都是以4k內(nèi)存頁(yè)面為單位進(jìn)行的。
3.系統(tǒng)利用率統(tǒng)計(jì)腳本程序
1.統(tǒng)計(jì)程序的簡(jiǎn)介
此系統(tǒng)利用率統(tǒng)計(jì)腳本程序由stat.sh、setup.sh組成,僅在AIX 4.3.3與5.2環(huán)境中測(cè)試通過(guò),尚不支持其他UNIX服務(wù)器。推薦將兩腳本置于/stat目錄,確保root對(duì)兩文件具有執(zhí)行權(quán)限(cd /stat;chmod 755 *.sh)。可運(yùn)行setup.sh腳本,此腳本將直接在root的crontab中添加一項(xiàng)。每晚23:55執(zhí)行stat.sh。腳本默認(rèn)輸出到/tmp/stat目錄,result.lst為日均統(tǒng)計(jì)值,輸出格式為“日期 內(nèi)存日均使用率% CPU每日峰值% CPU日均使用率%”每月統(tǒng)計(jì)量根據(jù)月中每日數(shù)據(jù)平均得出,每月1號(hào)凌晨產(chǎn)生上月統(tǒng)計(jì)數(shù)據(jù)并輸出至report.lst。腳本中關(guān)于crontab、awk的使用說(shuō)明及shell編程的方法請(qǐng)查閱相關(guān)技術(shù)文檔。
2.setup.sh腳本
在系統(tǒng)的命令行中執(zhí)行setup.sh,將/stat/stat.sh添加到root用戶的cron定時(shí)作業(yè)項(xiàng)中,添加文件名為/var/spool/cron/crontabs/root。否則報(bào)出定時(shí)作業(yè)已經(jīng)存在。代碼如下:
#!/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提供的兩個(gè)重要系統(tǒng)性能工具vmstat和svmon分別收集cpu和內(nèi)存的一整天的運(yùn)行統(tǒng)計(jì)數(shù)據(jù)。為了不影響系統(tǒng)的運(yùn)行,設(shè)定為在定時(shí)作業(yè)cron中每60秒執(zhí)行一次,全天24小時(shí)運(yùn)行,并將數(shù)據(jù)保存到cpu.日期和mem.日期文件中,以便于當(dāng)天23:55分運(yùn)行后使用awk工具進(jìn)行一天的統(tǒng)計(jì)計(jì)算。
眾所周知,awk進(jìn)行文本處理是逐行處理的,所以只需要設(shè)置計(jì)數(shù)器cnt變量進(jìn)行累加以便于計(jì)算cpu和內(nèi)存的平均利用率。我們以內(nèi)存平均利用率的算法進(jìn)行說(shuō)明,其他算法的產(chǎn)生與其相類似。
內(nèi)存平均利用率的算法為:
設(shè)置cnt、delta、tbase、base變量初始為零,cnt為行計(jì)數(shù)變量,delta保存內(nèi)存使用變化量,tbase為cron時(shí)間點(diǎn)上內(nèi)存使用量,base為總內(nèi)存量。
從mem.日期文件第一行開始,如果base為0,則將$2、$3域的值賦給base和tbase。然后進(jìn)行cnt++下一行處理,即將新時(shí)間點(diǎn)上的內(nèi)存使用量減去上一時(shí)間點(diǎn)的內(nèi)存使用量,并將結(jié)果賦給delta變量自加:
delta+=$3-tbase
直至最后一行,進(jìn)行100*(tbase+delta/cnt)/base即可得到當(dāng)天的內(nèi)存平均使用率了。
程序的代碼如下:
#!/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($16cidmin)cidmin=$16;cnt++;cidsum+=$16}END{if(cnt>0)printf("%.1ft%.1f",100-cidmin,100-cidsum/cnt)}' ${DDIR}/cpu.${OFILE} | read CPUPEAK CPUAVG
&nb
評(píng)論