在AIX日常運(yùn)維中,性能問(wèn)題一直是一個(gè)很重要的問(wèn)題,,為了讓操作系統(tǒng)能正常平穩(wěn)高效的運(yùn)行,,便需要一些武功秘籍來(lái)進(jìn)行快速定準(zhǔn)并解決問(wèn)題,本次我們便來(lái)討論一下我們可以用到的武功秘籍,。 所謂性能問(wèn)題,,主要幾種在CPU、內(nèi)存,、I/O三個(gè)大類(lèi)別,,因此我們分類(lèi)進(jìn)行討論。 檢查系統(tǒng)的三把斧頭一招便是topas,,這個(gè)是最常用也是最有效的一招,,通過(guò)topas的輸出可以看到CPU的使用情況。 從topas的輸出我們主要關(guān)注如下4個(gè)指標(biāo):
那么判定系統(tǒng)忙不忙的一個(gè)指標(biāo)為Idle%,,正常情況下,Idle%的值如果低于10%,,則這個(gè)系統(tǒng)的CPU就需要注意了,,此時(shí)關(guān)注一下是User%高還是Kern%高,如果是User%高,,則說(shuō)明是應(yīng)用程序占用CPU較多,,反之則說(shuō)明操作系統(tǒng)本身占用CPU較高。(但是請(qǐng)注意:并不是所有Kern%高都是操作系統(tǒng)本身導(dǎo)致的,,也有可能是應(yīng)用程序調(diào)用了系統(tǒng)本身的函數(shù),,這樣也會(huì)把這部分消耗算在Kern%頭上) 在拍完第一板斧后,我們繼續(xù)向下分析,,拍第二板斧trpof,,這個(gè)可以理解為精簡(jiǎn)版的trace,,一般情況下執(zhí)行這個(gè)命令對(duì)系統(tǒng)負(fù)載影響不太大,因此可以用這個(gè)工具先粗略看一下相關(guān)的進(jìn)程,。
通過(guò)tprof可以看出占用CPU排名靠前的進(jìn)程,。 如果root cause還沒(méi)有找到,那么便使出大招,,收trace數(shù)據(jù),。在收集trace數(shù)據(jù)前請(qǐng)先注意以下原則: ①收集trace數(shù)據(jù)會(huì)對(duì)當(dāng)前系統(tǒng)的負(fù)載有影響,在CPU已經(jīng)達(dá)到99%時(shí),,再收集trace有可能把操作系統(tǒng)搞夯,。 ②一定要等到問(wèn)題重現(xiàn)時(shí)收集trace,由于trace產(chǎn)生的數(shù)據(jù)量巨大,,因此要收集有效時(shí)間段的trace,。如果不確定問(wèn)題什么時(shí)候重現(xiàn),可以寫(xiě)個(gè)判斷腳本,,收集循環(huán)trace,。 ③用root用戶(hù)進(jìn)行trace收集 ④需要預(yù)估trace數(shù)據(jù)的大小,然后根據(jù)預(yù)估的空間,,在操作系統(tǒng)上找一個(gè)空間較大的地方存放數(shù)據(jù),。trace數(shù)據(jù)的大小可以用下列公式算出: 預(yù)估數(shù)據(jù)大小=邏輯CPU的個(gè)數(shù) * 10MB (其中邏輯CPU的個(gè)數(shù)可以用vmstat | grep -i lcpu命令查看) 在了解上述原則后,我們開(kāi)始收集trace數(shù)據(jù),。
在執(zhí)行完上述收集命令后,,會(huì)生成trace的raw文件。 下面對(duì)trace數(shù)據(jù)進(jìn)行轉(zhuǎn)換:
再用curt進(jìn)行數(shù)據(jù)處理:
此時(shí)產(chǎn)生一個(gè)curt.out文件,,可以直接進(jìn)行閱讀,。首先可以從“System Summary”字段看到各種類(lèi)型的進(jìn)程分別占用CPU的比例。 然后從“Application Summary”可以看到應(yīng)用占用CPU的排名,。 也可以從“System Calls Summary”可以看到系統(tǒng)函數(shù)調(diào)用排名情況,。 OK,到此我們便把這三把斧拍完了,,那么我們來(lái)討論一個(gè)真實(shí)的案例,,來(lái)從中看看這三把斧是怎么拍的。 故障描述: 生產(chǎn)環(huán)境CPU使用率高,,導(dǎo)致應(yīng)用程序運(yùn)行緩慢,,批量程序無(wú)法按時(shí)完成。 系統(tǒng)環(huán)境: AIX 6100-07-05 處理過(guò)程: Step1,,使用topas查看,,發(fā)現(xiàn)CPU使用率很高,其中大部分為Kern%占用。 Step2,,收集tprof數(shù)據(jù),,tprof -skeuj -x sleep 10,找到占用CPU最高的兩個(gè)進(jìn)程,。
Step3,,收集trace數(shù)據(jù),并進(jìn)行分析,,發(fā)現(xiàn)絕大多數(shù)是系統(tǒng)調(diào)用,。當(dāng)時(shí)以為是操作系統(tǒng)的BUG或者操作系統(tǒng)本身導(dǎo)致的,初步判斷和應(yīng)用程序沒(méi)有關(guān)系,,但后來(lái)證明當(dāng)時(shí)這個(gè)想法是錯(cuò)誤的,這也說(shuō)明并不是所有kernel高是由于系統(tǒng)本身造成的,,如果應(yīng)用程序調(diào)用系統(tǒng)本身函數(shù),,也算在kernel頭上。
Step4,,通過(guò)curt文件輸出,,看到占用kernel最高的是paged_ds_start函數(shù)。 Step5,,分析調(diào)用paged_ds_start函數(shù)的進(jìn)程為ndmsmgr,,這是一個(gè)應(yīng)用的進(jìn)程! Step6,那么分析ndmsmgr為什么會(huì)調(diào)用較高的kernel運(yùn)算,。使用truss命令跟蹤這個(gè)進(jìn)程,。經(jīng)分析這個(gè)進(jìn)程在對(duì)文件進(jìn)行操作完成后對(duì)文件執(zhí)行close操作時(shí)有報(bào)錯(cuò),返回值為ERR#9 EBADF,,該報(bào)錯(cuò)表述有無(wú)效的文件描述符,,經(jīng)查發(fā)現(xiàn)這進(jìn)程會(huì)調(diào)用close函數(shù),把文件描述符從0到65533的文件全部關(guān)閉一遍,。也就是說(shuō)應(yīng)用進(jìn)程在調(diào)用大量的close()函數(shù)導(dǎo)致系統(tǒng)kernel使用率飆升!這也就把耗資源的賬偽造到了kernel頭上,。 最終升級(jí)應(yīng)用程序解決了該問(wèn)題。 下面我們來(lái)討論內(nèi)存的使用情況,,首先也可以使用topas命令進(jìn)行內(nèi)存使用情況的查看,。 從topas的輸出中可以看到物理內(nèi)存共有64GB,paging space共有16個(gè)GB,。其中物理內(nèi)存部分:計(jì)算內(nèi)存使用了27%,,文件系統(tǒng)緩存使用了9%。那么問(wèn)題來(lái)了,,真正用于運(yùn)算的內(nèi)存是多少呢,?答案是物理內(nèi)存的27%。切記一定不要把文件系統(tǒng)緩存的使用當(dāng)成內(nèi)存的真實(shí)消耗。因此當(dāng)有新的內(nèi)存申請(qǐng)時(shí),,文件系統(tǒng)的緩存是可以被換出來(lái)的,。那么一般來(lái)看,當(dāng)計(jì)算內(nèi)存達(dá)到90%時(shí),,則系統(tǒng)就會(huì)有性能問(wèn)題,;當(dāng)達(dá)到95%以上,一般就會(huì)產(chǎn)生內(nèi)存換頁(yè),,這時(shí)就會(huì)把物理內(nèi)存中的數(shù)據(jù)換到了paging space中,,而如果短時(shí)間內(nèi)有大量的換頁(yè)產(chǎn)生,就很有可能引起操作系統(tǒng)夯,,而如果在有HACMP或者oracle RAC集群環(huán)境中,,就有可能導(dǎo)致集群強(qiáng)制把操作系統(tǒng)重啟。因此對(duì)計(jì)算內(nèi)存的監(jiān)控非常重要,。 說(shuō)到內(nèi)存,,不得不說(shuō)的是svmon這個(gè)命令,這個(gè)命令可以查看更細(xì)的內(nèi)存使用情況,,例如每個(gè)進(jìn)程占用多少內(nèi)存等等信息,。 可以用svmon -G命令查看內(nèi)存的整體使用情況。那么問(wèn)題又來(lái)了,,這個(gè)輸出應(yīng)該怎么看,?圖中virtual字段是真實(shí)消耗的計(jì)算內(nèi)存的業(yè)面數(shù),size是物理內(nèi)存的業(yè)面數(shù),,因此計(jì)算內(nèi)存的比值=4406839/16777216=27%,。 那么如何查看每個(gè)進(jìn)程所使用的內(nèi)存量呢?可以用svmon -P 下面我們來(lái)看看占有內(nèi)存的排名情況,,我們要按占用內(nèi)存的量由多到少進(jìn)行排列,,這個(gè)可以按如下方式進(jìn)行(注意:最后一列已經(jīng)換算成MB): 那么對(duì)于目前AIX 6.1和AIX 7.1版本,常見(jiàn)的幾個(gè)建議調(diào)優(yōu)的參數(shù)如下: - minperm% = 3 - maxperm% = 90 - maxclient% = 90 - lru_file_repage=0 - default from AIX 6.1. lru_file_repage set to 0 makes repage rates to be ignored when determining what kind of page to steal, means filecache will be steal when above minperm. - strict_maxperm%=0 另外,,perfPMR也是收集性能數(shù)據(jù)常用的工具,,下載網(wǎng)址如下: ftp://ftp.software.ibm.com/aix/tools/perftools/perfpmr 可以用perfPMR提供的腳本進(jìn)行memdetails.sh進(jìn)行更詳細(xì)的內(nèi)存數(shù)據(jù)收集。 也可以使用nmon對(duì)內(nèi)存進(jìn)行分析,,可以看到一天內(nèi)的內(nèi)存整體使用情況,。其中深紅色的為計(jì)算內(nèi)存,,淡藍(lán)色的為文件系統(tǒng)緩存,黃色的為文件系統(tǒng)緩存,。 也可以按進(jìn)程看到占用內(nèi)存的情況,。 談起I/O不可避免的要首先了解LVM相關(guān)的一些技巧。 我們先談?wù)刲v的mapping關(guān)系,,這個(gè)東西說(shuō)起來(lái)很簡(jiǎn)單,,但實(shí)際上它和I/O的性能和LV誤刪后的恢復(fù)有密切的關(guān)系,因此了解清楚LV映射對(duì)于系統(tǒng)運(yùn)維有很大的幫助,。 可以通過(guò)lslv -m 通過(guò)fileplace命令也可以看到詳細(xì)的分布信息,。 通過(guò)readvgda 通過(guò)getlvcb命令可以得到LVCB的信息。 在了解完了LV的分布后,,我們回到性能監(jiān)控上,,iostat是一個(gè)很好用的命令。 通過(guò)這個(gè)命令可以看到每個(gè)磁盤(pán)的繁忙程度,、響應(yīng)時(shí)間,、是否有I/O排隊(duì)等信息。 topas -D也可以看到磁盤(pán)的相關(guān)信息,。但在topas輸出中一定注意CPU中的idle%是否較高,,由于idle%說(shuō)明CPU在等待I/O,因此如果有idle%數(shù)值時(shí),,一定檢查一下存儲(chǔ)盤(pán)是否有問(wèn)題,。 如果要抓取I/O的詳細(xì)信息,可以用filemon命令進(jìn)行數(shù)據(jù)抓取,。 filemon -O all -o filemon.out; sleep 30; trcstop 本文從AIX CPU,、內(nèi)存、I/O三個(gè)方面探討了相關(guān)的問(wèn)題診斷及調(diào)整,,可以當(dāng)作拋磚引玉,,供大家進(jìn)行討論參考。 |
|