當一個系統運行緩慢性能下降的時候很難知道原因是什麼是內存洩漏磁盤子系統瓶頸還是某個特定應用程序在可擴展性方面有限制?有一些途徑可以發現和了解引起性能問題的根源並且有可能消除它
本文給出了從哪裡入手的一些建議文中介紹了如何著手性能方面的考慮以及如何定位常見的性能瓶頸還介紹了與性能密切相關一些概念比如私有的共享內存(ISMIntimate Shared Memory)與優先內存頁面調度文章重點是放在Solaris 操作環境下
著手性能問題
性能或許比計算機系統其它方面的行為更需要有通盤的考慮為了識別來自一個或多個組件的問題根源必須要采取結構化的方法
實際的結果是解決性能問題過程中最重要的一個部分是定義你正在試圖解決的問題從實際應用的方面來講這意味著定義一個操作或者測試用例從而可以
A) 知道系統當前有多快
B) 知道系統需要快X倍或者知道系統曾經在不同環境下快過X倍
設置基線是開始的第一步性能分析是由簡單明確地定義所需解決的問題開始的自上而下的一個過程如果你想要一個系統運行得快一些你仍然需要定義這個系統的哪些屬性是你想要改進的以及哪些代價是你可以接受或者不可以接受的除非你能夠明確地描述出問題症狀/機會想要識別出問題的根源只會是碰運氣
性能分析很象是偵探工作我們通過證據和觀察建立事實依據非常小心不要陷入預先想象的與事實不符的結論中——只有在具備非常壓倒性的證據時才確認猜想
對所有假設都要懷疑其他人聲稱的事實實際上只是個可能正確也可能不正確的假設如果這個假設是錯誤的你可能會是在不正確的依據下工作從而得出不正確的結論
這裡有一些警告Solaris操作環境在大多數情形下對於工作負荷的自我性能優化都是很好的發行版本越新需要手工做的性能優化就越少性能問題的根源經常被發現是因為一個試圖優化性能的行為引起的首先需要注意應用程序最後才是操作環境
任何對系統配置的更改比如象內存大小和磁盤布局這樣的性能設置都應該檢查其當前的正確性同樣一個帶參數的系統升級也有可能對新操作環境的性能帶來影響
性能監測
從暴露出來的問題開始
什麼操作使你看到性能問題的症狀?
比如說是特定類型的數據庫查詢文件或網絡操作比你期望的慢?在給出測試用例方面你能把操作步驟做到多具體例如一個SQL查詢或者行的C程序?
最大程度利用你的知識盡可能准確地說明什麼地方出了什麼問題以定義你的問題良好的問題說明的例子就像這樣
一個SQL查詢在VXFS上比在UFS上要花兩倍的時間
SVR消息隊列操作在操作環境版本A上比在操作環境版本B上要多花百分之的時間
登錄進系統A比登錄進系統Y多花三倍的時間
一個問題說明不應該包括解決方法或者是可能的解決方法
在大部分的時候對問題有一個清晰的說明就意味著完成了解決問題過程的一大半了在對你試圖解決的問題進行說明的時候考慮到用戶觀點的因素也很重要這意味著要從應用程序的角度來看這和人們的天性相反人們總是通過實驗試圖去證明或者證偽一個可能的原因而不是依據觀察得到的事實來評估一個原因的可能性程度
不恰當的問題說明就象這樣
mpstat的wt列表明等待時間過多
用戶任務花時間太長
一個系統和它的應用程序的功能正確性問題與性能問題之間的邊界往往是一個灰色地帶整個系統掛起與進程掛起的問題不在本文討論范圍之內如果你懷疑系統的功能不正確而不是性能問題那麼給你的SUN解決方案中心打電話以找到一個解決問題的方法高性能系統的前提是它的功能首先要正確
作為你積極的維護計劃的一部分檢查/var/adm/messages中有沒有比如磁盤重試之類的硬件問題或者有沒有額外的消息產生也是很有價值的
察看系統的歷史信息也非常有價值如果你的系統曾經有過更好的性能畫一條時間曲線詳細記錄何時第一次發現性能變差以及從什麼時候開始性能一直很差
知道你的系統在正常情況下會怎樣
保存你的系統是如何正常運轉的樣例是一個好主意你可以很容易地收集和保存每月的性能數據比如
*stat類vmstat mpstat iostat vxstatsar
ps的輸出以顯示哪些進程在運行 (在Solaris 操作環境下是prstat)另外有不少商業的和無支持的產品都可以用來做性能監測一個免費的無支持的可選產品是SE Toolkit(要獲得其各種版本的信息請看Sun Performance SE Toolkit page)SE Toolkit報告磁盤活動CPU利用情況TCP和網絡連接內存以及其他更多信息在我們的經驗裡它安裝方便不需要重啟系統並且生成容易理解的圖形顯示
很多這類產品都存在一個共同的問題就是對不同的硬件配置有不同的門限值例如特定的門限值對於MHz的系統可能顯得太過會讓這個系統慢得象是在爬一樣但是對於一個MHz的系統卻可能是可以接受的
尋找性能瓶頸
一旦你已經定義了需要解決的性能問題下一步驟就是縮小范圍到瓶頸產生的地方
這個階段有必要問這樣一些問題
應用程序能告訴我它看到哪些是瓶頸?拿Oracle作例子一個Oracle數據庫管理員應該知道BSTAT/ESTATS是什麼以及如何運行和理解它們還是那句話從應用程序的角度來看問題BSTATS/ESTATS可以顯示限制了Oralce性能的瓶頸這可以作為進一步分析的指導
大部分的時間花在哪裡是內核還是用戶進程?通過vmstatmpstatsarpsprstat可以回答這個問題
具有相近類型的所有資源是否同樣繁忙?這個問題的意義在於尋找資源的不平等分布比如一個磁盤可能是瓶頸所在或者一個CPU會比其他CPU更忙對CPU看mpstat對磁盤用iostat 哪個或哪些進程在使用最多的資源?用這些命令可以看到使用CPU和內存最多的進程
ps eo pidpcpuargs | sort +n
CPU百分比
ps eo pidvszargs | sort +n
K字節的虛擬內存
/usr/ucb/ps aux |more
輸出被排序使用CPU和內存最多的進程排在上面
Solaris 操作環境提供了prstat它給出CPU和內存使用情況的一個動態注解prstat cvm的輸出結果非常有用
我們現在來看看怎用使常見的Solaris命令來開始性能分析
vmstat命令是簡單的這裡我們可以看到一個對於正在執行的應用程序CPU能力不足的例子
% vmstat
procs memory page disk faults cpu
r b w swap free re mf pi po fr de sr m m m m in sy cs us sy id
vmstat輸出的第一行總是可以忽略在procs下面標著r的一列是等待獲得CPU的進程運行隊列中的進程數id列是CPU空閒時間這台機器沒有足夠的CPU資源以滿足進程運行的需要這可以從它的大部分CPU時間花在用戶空間裡看出來(看us列)
這裡有兩種辦法可供采用——第一增加更多的CPU或者第二對應用程序的代碼作性能分析看看是不是應用程序的某部分可以優化對代碼片斷作優化可能會需要非常大量的努力——而且有時候收到的效果很少在關系到時間的時候最好在考慮你可能的投資回報時現實一點
From:http://tw.wingwit.com/Article/program/Oracle/201311/18580.html