詳細(xì)講解Oracle在Solaris下的性能與調(diào)整
當(dāng)一個(gè)系統(tǒng)運(yùn)行緩慢性能下降的時(shí)候,很難知道原因是什么。是內(nèi)存泄漏,磁盤子系統(tǒng)瓶頸,還是某個(gè)特定應(yīng)用程序在可擴(kuò)展性方面有限制?有一些途徑可以發(fā)現(xiàn)和了解引起性能問(wèn)題的根源,并且有可能消除它。
本文給出了從哪里入手的一些建議。文中介紹了如何著手性能方面的考慮以及如何定位常見(jiàn)的性能瓶頸,還介紹了與性能密切相關(guān)一些概念,比如私有的共享內(nèi)存(ISM-Intimate Shared Memory)與優(yōu)先內(nèi)存頁(yè)面調(diào)度。文章重點(diǎn)是放在Solaris 2.6操作環(huán)境下。
著手性能問(wèn)題
性能,或許比計(jì)算機(jī)系統(tǒng)其它方面的行為更需要有通盤的考慮。為了識(shí)別來(lái)自一個(gè)或多個(gè)組件的問(wèn)題根源,必須要采取結(jié)構(gòu)化的方法。
實(shí)際的結(jié)果是,解決性能問(wèn)題過(guò)程中最重要的一個(gè)部分是定義你正在試圖解決的問(wèn)題。從實(shí)際應(yīng)用的方面來(lái)講,這意味著定義一個(gè)操作或者測(cè)試用例,從而可以:
A) 知道系統(tǒng)當(dāng)前有多快。
B) 知道系統(tǒng)需要快'X'倍;或者知道系統(tǒng)曾經(jīng)在不同環(huán)境下快過(guò)'X'倍。
設(shè)置基線是開始的第一步。性能分析是由簡(jiǎn)單明確地定義所需解決的問(wèn)題開始的自上而下的一個(gè)過(guò)程。如果你想要一個(gè)系統(tǒng)運(yùn)行得快一些,你仍然需要定義這個(gè)系統(tǒng)的哪些屬性是你想要改進(jìn)的,以及哪些代價(jià)是你可以接受或者不可以接受的。除非你能夠明確地描述出問(wèn)題癥狀/機(jī)會(huì),想要識(shí)別出問(wèn)題的根源只會(huì)是碰運(yùn)氣。
性能分析很象是偵探工作,我們通過(guò)證據(jù)和觀察建立事實(shí)依據(jù),非常小心不要陷入預(yù)先想象的與事實(shí)不符的結(jié)論中——只有在具備非常壓倒性的證據(jù)時(shí)才確認(rèn)猜想。
對(duì)所有假設(shè)都要懷疑。其他人聲稱的事實(shí)實(shí)際上只是個(gè)可能正確也可能不正確的假設(shè)。如果這個(gè)假設(shè)是錯(cuò)誤的,你可能會(huì)是在不正確的依據(jù)下工作,從而得出不正確的結(jié)論。
這里有一些警告。Solaris操作環(huán)境在大多數(shù)情形下對(duì)于工作負(fù)荷的自我性能優(yōu)化都是很好的。發(fā)行版本越新,需要手工做的性能優(yōu)化就越少。性能問(wèn)題的根源經(jīng)常被發(fā)現(xiàn)是因?yàn)橐粋€(gè)試圖優(yōu)化性能的行為引起的。首先需要注意應(yīng)用程序,最后才是操作環(huán)境。
任何對(duì)系統(tǒng)配置的更改,比如象內(nèi)存大小和磁盤布局這樣的性能設(shè)置,都應(yīng)該檢查其當(dāng)前的正確性。同樣,一個(gè)帶參數(shù)的系統(tǒng)升級(jí)也有可能對(duì)新操作環(huán)境的性能帶來(lái)影響。
性能監(jiān)測(cè)
1. 從暴露出來(lái)的問(wèn)題開始
什么操作使你看到性能問(wèn)題的癥狀?
比如說(shuō),是特定類型的數(shù)據(jù)庫(kù)查詢,文件或網(wǎng)絡(luò)操作比你期望的慢?在給出測(cè)試用例方面你能把操作步驟做到多具體,例如一個(gè)SQL查詢或者30行的C程序?
最大程度利用你的知識(shí)盡可能準(zhǔn)確地說(shuō)明“什么地方出了什么問(wèn)題”以定義你的問(wèn)題。良好的問(wèn)題說(shuō)明的例子就像這樣:
一個(gè)SQL查詢?cè)赩XFS上比在UFS上要花兩倍的時(shí)間。
SVR4消息隊(duì)列操作在操作環(huán)境版本A上比在操作環(huán)境版本B上要多花百分之30的時(shí)間。
登錄進(jìn)系統(tǒng)A比登錄進(jìn)系統(tǒng)Y多花三倍的時(shí)間。
一個(gè)問(wèn)題說(shuō)明不應(yīng)該包括解決方法或者是可能的解決方法。
在大部分的時(shí)候,對(duì)問(wèn)題有一個(gè)清晰的說(shuō)明就意味著完成了解決問(wèn)題過(guò)程的一大半了。在對(duì)你試圖解決的問(wèn)題進(jìn)行說(shuō)明的時(shí)候考慮到用戶觀點(diǎn)的因素也很重要,這意味著要從應(yīng)用程序的角度來(lái)看。這和人們的天性相反,人們總是通過(guò)實(shí)驗(yàn)試圖去證明或者證偽一個(gè)可能的原因,而不是依據(jù)觀察得到的事實(shí)來(lái)評(píng)估一個(gè)原因的可能性程度。
不恰當(dāng)?shù)膯?wèn)題說(shuō)明就象這樣:
mpstat的'wt'列表明等待時(shí)間過(guò)多。
用戶任務(wù)花時(shí)間太長(zhǎng)。
一個(gè)系統(tǒng)和它的應(yīng)用程序的功能正確性問(wèn)題與性能問(wèn)題之間的邊界往往是一個(gè)灰色地帶。整個(gè)系統(tǒng)掛起與進(jìn)程掛起的問(wèn)題不在本文討論范圍之內(nèi)。如果你懷疑系統(tǒng)的功能不正確,而不是性能問(wèn)題,那么給你的SUN解決方案中心打電話以找到一個(gè)解決問(wèn)題的方法。高性能系統(tǒng)的前提是它的功能首先要正確。
作為你積極的維護(hù)計(jì)劃的一部分,檢查/var/adm/messages中有沒(méi)有比如磁盤重試之類的硬件問(wèn)題或者有沒(méi)有額外的消息產(chǎn)生也是很有價(jià)值的。
察看系統(tǒng)的歷史信息也非常有價(jià)值;如果你的系統(tǒng)曾經(jīng)有過(guò)更好的性能,畫一條時(shí)間曲線詳細(xì)記錄何時(shí)第一次發(fā)現(xiàn)性能變差以及從什么時(shí)候開始性能一直很差。
2. 知道你的系統(tǒng)在正常情況下會(huì)怎樣
保存你的系統(tǒng)是如何正常運(yùn)轉(zhuǎn)的樣例是一個(gè)好主意。你可以很容易地收集和保存每月的性能數(shù)據(jù),比如:
*stat類:vmstat, mpstat, iostat, vxstat,sar
ps的輸出以顯示哪些進(jìn)程在運(yùn)行 (在Solaris 8操作環(huán)境下是prstat)。另外,有不少商業(yè)的和無(wú)支持的產(chǎn)品都可以用來(lái)做性能監(jiān)測(cè)。一個(gè)免費(fèi)的無(wú)支持的可選產(chǎn)品是SE Toolkit(要獲得其各種版本的信息,請(qǐng)看Sun Performance SE Toolkit page)。SE Toolkit報(bào)告磁盤活動(dòng)、CPU利用情況、TCP和網(wǎng)絡(luò)連接、內(nèi)存,以及其他更多信息。在我們的經(jīng)驗(yàn)里,它安裝方便,不需要重啟系統(tǒng),并且生成容易理解的圖形顯示。
很多這類產(chǎn)品都存在一個(gè)共同的問(wèn)題,就是對(duì)不同的硬件配置有不同的門限值。例如,特定的門限值對(duì)于400-MHz的系統(tǒng)可能顯得太過(guò),會(huì)讓這個(gè)系統(tǒng)慢得象是在爬一樣,但是對(duì)于一個(gè)900-MHz的系統(tǒng)卻可能是可以接受的。
3. 尋找性能瓶頸
一旦你已經(jīng)定義了需要解決的性能問(wèn)題,下一步驟就是縮小范圍到瓶頸產(chǎn)生的地方。
這個(gè)階段有必要問(wèn)這樣一些問(wèn)題:
應(yīng)用程序能告訴我它看到哪些是瓶頸?拿Oracle作例子,一個(gè)Oracle數(shù)據(jù)庫(kù)管理員應(yīng)該知道BSTAT/ESTATS是什么以及如何運(yùn)行和理解它們。還是那句話,從應(yīng)用程序的角度來(lái)看問(wèn)題,BSTATS/ESTATS可以顯示限制了Oralce性能的瓶頸,這可以作為進(jìn)一步分析的指導(dǎo)。
大部分的時(shí)間花在哪里,是內(nèi)核還是用戶進(jìn)程?通過(guò)vmstat、mpstat、sar、ps、prstat可以回答這個(gè)問(wèn)題。
具有相近類型的所有資源是否同樣繁忙?這個(gè)問(wèn)題的意義在于尋找資源的不平等分布。比如,一個(gè)磁盤可能是瓶頸所在,或者一個(gè)CPU會(huì)比其他CPU更忙。對(duì)CPU,看mpstat。對(duì)磁盤,用iostat。哪個(gè)或哪些進(jìn)程在使用最多的資源?用這些命令可以看到使用CPU和內(nèi)存最多的進(jìn)程:
ps -eo pid,pcpu,args | sort +1n
CPU百分比:
ps -eo pid,vsz,args | sort +1n
K字節(jié)的虛擬內(nèi)存:
/usr/ucb/ps aux |more
輸出被排序,使用CPU和內(nèi)存最多的進(jìn)程排在上面。
Solaris 8操作環(huán)境提供了prstat,它給出CPU和內(nèi)存使用情況的一個(gè)動(dòng)態(tài)注解。prstat -cvm的輸出結(jié)果非常有用。
我們現(xiàn)在來(lái)看看怎用使常見(jiàn)的Solaris命令來(lái)開始性能分析。
vmstat命令是簡(jiǎn)單的。這里我們可以看到一個(gè)對(duì)于正在執(zhí)行的應(yīng)用程序,CPU能力不足的例子。
% vmstat 15
procs memory page disk faults cpu
r b w swap free re mf pi po fr de sr m0 m1 m2 m3 in sy cs us sy id
45 0 0 2887216 182104 3 707 449 6 455 0 80 2 6 1 0 1531 5797 983 61 30 9
58 0 0 2831312 46408 5 983 582 56 3211 0 492 0 0 0 0 1413 4797 1027 69 31 0
55 0 0 2830944 56064 2 649 656 3 806 0 121 0 0 0 0 1441 4627 989 69 31 0
57 0 0 2827704 48760 4 818 723 6 800 0 121 0 0 1 0 1606 4316 1160 66 34 0
56 0 0 2824712 47512 6 857 604 56 1736 0 261 0 0 1 0 1584 4939 1086 68 32 0
58 0 0 2813400 47056 7 856 673 33 2374 0 355 0 0 0 0 1676 5112 1114 70 30 0
60 1 0 2816712 49464 7 861 720 6 731 0 110 7 0 3 0 2329 6131 1067 64 36 0
58 0 0 2817552 48392 4 585 521 0 996 0 146 0 0 0 0 1357 6724 1059 71 29 0
vmstat輸出的第一行總是可以忽略。在'procs'下面標(biāo)著'r'的一列是等待獲得CPU的進(jìn)程運(yùn)行隊(duì)列中的進(jìn)程數(shù)。'id'列是CPU空閑時(shí)間。這臺(tái)機(jī)器沒(méi)有足夠的CPU資源以滿足進(jìn)程運(yùn)行的需要,這可以從它的大部分CPU時(shí)間花在用戶空間里看出來(lái)(看'us'列)。
這里有兩種辦法可供采用——第一,增加更多的CPU,或者第二,對(duì)應(yīng)用程序的代碼作性能分析看看是不是應(yīng)用程序的某部分可以優(yōu)化。對(duì)代碼片斷作優(yōu)化可能會(huì)需要非常大量的努力——而且有時(shí)候收到的效果很少。在關(guān)系到時(shí)間的時(shí)候,最好在考慮你可能的“投資回報(bào)”時(shí)現(xiàn)實(shí)一點(diǎn)。
