老牌運(yùn)維教你如何快速分析Linux服務(wù)器的性能問(wèn)題
作為一名linux系統(tǒng)運(yùn)維人員,最主要的工作是優(yōu)化系統(tǒng)配置,使應(yīng)用在系統(tǒng)上以最優(yōu)的狀態(tài)運(yùn)行,但是由于硬件問(wèn)題、軟件問(wèn)題、網(wǎng)絡(luò)環(huán)境等的復(fù)雜性 和多變性,導(dǎo)致對(duì)系統(tǒng)的優(yōu)化變得異常復(fù)雜,如何定位性能問(wèn)題出在哪個(gè)方面,是性能優(yōu)化的一大難題, 本章從系統(tǒng)入手,重點(diǎn)講述由于系統(tǒng)軟、硬件配置不當(dāng)可能造成的性能問(wèn)題,并且給出了檢測(cè)系統(tǒng)故障和優(yōu)化性能的一般方法和流程。
1 cpu性能評(píng)估
Cpu是影響Linux性能的主要因素之一,下面先介紹幾個(gè)查看CPU性能的命令。
1.1 vmstat命令
該命令可以顯示關(guān)于系統(tǒng)各種資源之間相關(guān)性能的簡(jiǎn)要信息,這里我們主要用它來(lái)看CPU的一個(gè)負(fù)載情況。
下面是vmstat命令在某個(gè)系統(tǒng)的輸出結(jié)果:
- [root@node1 ~]# vmstat 2 3
- procs ———–memory———- —swap– —–io—- –system– —–cpu——
- r b swpd free buff cache si so bi bo in cs us sy id wa st
- 0 0 0 162240 8304 67032 0 0 13 21 1007 23 0 1 98 0 0
- 0 0 0 162240 8304 67032 0 0 1 0 1010 20 0 1 100 0 0
- 0 0 0 162240 8304 67032 0 0 1 1 1009 18 0 1 99 0 0
對(duì)上面每項(xiàng)的輸出解釋如下:
- procs
- r列表示運(yùn)行和等待cpu時(shí)間片的進(jìn)程數(shù),這個(gè)值如果長(zhǎng)期大于系統(tǒng)CPU的個(gè)數(shù),說(shuō)明CPU不足,需要增加CPU。
- b列表示在等待資源的進(jìn)程數(shù),比如正在等待I/O、或者內(nèi)存交換等。
- memory
- swpd列表示切換到內(nèi)存交換區(qū)的內(nèi)存數(shù)量(以k為單位)。如果swpd的值不為0,或者比較大,只要si、so的值長(zhǎng)期為0,這種情況下一般不用擔(dān)心,不會(huì)影響系統(tǒng)性能。
- free列表示當(dāng)前空閑的物理內(nèi)存數(shù)量(以k為單位)
- buff列表示buffers cache的內(nèi)存數(shù)量,一般對(duì)塊設(shè)備的讀寫(xiě)才需要緩沖。
- cache列表示page cached的內(nèi)存數(shù)量,一般作為文件系統(tǒng)cached,頻繁訪問(wèn)的文件都會(huì)被cached,如果cache值較大,說(shuō)明cached的文件數(shù)較多,如果此時(shí)IO中bi比較小,說(shuō)明文件系統(tǒng)效率比較好。
- swap
- si列表示由磁盤(pán)調(diào)入內(nèi)存,也就是內(nèi)存進(jìn)入內(nèi)存交換區(qū)的數(shù)量。
- so列表示由內(nèi)存調(diào)入磁盤(pán),也就是內(nèi)存交換區(qū)進(jìn)入內(nèi)存的數(shù)量。
一般情況下,si、so的值都為0,如果si、so的值長(zhǎng)期不為0,則表示系統(tǒng)內(nèi)存不足。需要增加系統(tǒng)內(nèi)存。
- IO項(xiàng)顯示磁盤(pán)讀寫(xiě)狀況
- Bi列表示從塊設(shè)備讀入數(shù)據(jù)的總量(即讀磁盤(pán))(每秒kb)。
- Bo列表示寫(xiě)入到塊設(shè)備的數(shù)據(jù)總量(即寫(xiě)磁盤(pán))(每秒kb)
這里我們?cè)O(shè)置的bi+bo參考值為1000,如果超過(guò)1000,而且wa值較大,則表示系統(tǒng)磁盤(pán)IO有問(wèn)題,應(yīng)該考慮提高磁盤(pán)的讀寫(xiě)性能。
- system 顯示采集間隔內(nèi)發(fā)生的中斷數(shù)
- in列表示在某一時(shí)間間隔中觀測(cè)到的每秒設(shè)備中斷數(shù)。
- cs列表示每秒產(chǎn)生的上下文切換次數(shù)。
上面這2個(gè)值越大,會(huì)看到由內(nèi)核消耗的CPU時(shí)間會(huì)越多。
- CPU項(xiàng)顯示了CPU的使用狀態(tài),此列是我們關(guān)注的重點(diǎn)。
- us列顯示了用戶(hù)進(jìn)程消耗的CPU 時(shí)間百分比。us的值比較高時(shí),說(shuō)明用戶(hù)進(jìn)程消耗的cpu時(shí)間多,但是如果長(zhǎng)期大于50%,就需要考慮優(yōu)化程序或算法。
- sy列顯示了內(nèi)核進(jìn)程消耗的CPU時(shí)間百分比。Sy的值較高時(shí),說(shuō)明內(nèi)核消耗的CPU資源很多。
根據(jù)經(jīng)驗(yàn),us+sy的參考值為80%,如果us+sy大于 80%說(shuō)明可能存在CPU資源不足。
- id 列顯示了CPU處在空閑狀態(tài)的時(shí)間百分比。
- wa列顯示了IO等待所占用的CPU時(shí)間百分比。wa值越高,說(shuō)明IO等待越嚴(yán)重,根據(jù)經(jīng)驗(yàn),wa的參考值為20%,如果wa超過(guò)20%,說(shuō)明IO等待嚴(yán)重,引起IO等待的原因可能是磁盤(pán)大量隨機(jī)讀寫(xiě)造成的,也可能是磁盤(pán)或者磁盤(pán)控制器的帶寬瓶頸造成的(主要是塊操作)。
綜上所述,在對(duì)CPU的評(píng)估中,需要重點(diǎn)注意的是procs項(xiàng)r列的值和CPU項(xiàng)中us、sy和id列的值。
1.2 sar命令
檢查CPU性能的第二個(gè)工具是sar,sar功能很強(qiáng)大,可以對(duì)系統(tǒng)的每個(gè)方面進(jìn)行單獨(dú)的統(tǒng)計(jì),但是使用sar命令會(huì)增加系統(tǒng)開(kāi)銷(xiāo),不過(guò)這些開(kāi)銷(xiāo)是可以評(píng)估的,對(duì)系統(tǒng)的統(tǒng)計(jì)結(jié)果不會(huì)有很大影響。
下面是sar命令對(duì)某個(gè)系統(tǒng)的CPU統(tǒng)計(jì)輸出:
- [root@webserver ~]# sar -u 3 5
- Linux 2.6.9-42.ELsmp (webserver) 11/28/2008 _i686_ (8 CPU)
- 11:41:24 AM CPU %user %nice %system %iowait %steal %idle
- 11:41:27 AM all 0.88 0.00 0.29 0.00 0.00 98.83
- 11:41:30 AM all 0.13 0.00 0.17 0.21 0.00 99.50
- 11:41:33 AM all 0.04 0.00 0.04 0.00 0.00 99.92
- 11:41:36 AM all 0.29 0.00 0.13 0.00 0.00 99.58
- 11:41:39 AM all 0.38 0.00 0.17 0.04 0.00 99.41
- Average: all 0.34 0.00 0.16 0.05 0.00 99.45
對(duì)上面每項(xiàng)的輸出解釋如下:
- %user列顯示了用戶(hù)進(jìn)程消耗的CPU 時(shí)間百分比。
- %nice列顯示了運(yùn)行正常進(jìn)程所消耗的CPU 時(shí)間百分比。
- %system列顯示了系統(tǒng)進(jìn)程消耗的CPU時(shí)間百分比。
- %iowait列顯示了IO等待所占用的CPU時(shí)間百分比
- %steal列顯示了在內(nèi)存相對(duì)緊張的環(huán)境下pagein強(qiáng)制對(duì)不同的頁(yè)面進(jìn)行的steal操作 。
- %idle列顯示了CPU處在空閑狀態(tài)的時(shí)間百分比。
這個(gè)輸出是對(duì)系統(tǒng)整體CPU使用狀況的統(tǒng)計(jì),每項(xiàng)的輸出都非常直觀,并且最后一行Average是個(gè)匯總行,是上面統(tǒng)計(jì)信息的一個(gè)平均值。
需要注意的一點(diǎn)是:第一行的統(tǒng)計(jì)信息中包含了sar本身的統(tǒng)計(jì)消耗,所以%user列的值會(huì)偏高一點(diǎn),不過(guò),這不會(huì)對(duì)統(tǒng)計(jì)結(jié)果產(chǎn)生多大影響。
在一個(gè)多CPU的系統(tǒng)中,如果程序使用了單線程,會(huì)出現(xiàn)這么一個(gè)現(xiàn)象,CPU的整體使用率不高,但是系統(tǒng)應(yīng)用卻響應(yīng)緩慢,這可能是由于程序使用單線程的原因,單線程只使用一個(gè)CPU,導(dǎo)致這個(gè)CPU占用率為100%,無(wú)法處理其它請(qǐng)求,而其它的CPU卻閑置,這就導(dǎo)致 了整體CPU使用率不高,而應(yīng)用緩慢 現(xiàn)象的發(fā)生 。
針對(duì)這個(gè)問(wèn)題,可以對(duì)系統(tǒng)的每個(gè)CPU分開(kāi)查詢(xún),統(tǒng)計(jì)每個(gè)CPU的使用情況:
- [root@webserver ~]# sar -P 0 3 5
- Linux 2.6.9-42.ELsmp (webserver) 11/29/2008 _i686_ (8 CPU)
- 06:29:33 PM CPU %user %nice %system %iowait %steal %idle
- 06:29:36 PM 0 3.00 0.00 0.33 0.00 0.00 96.67
- 06:29:39 PM 0 0.67 0.00 0.33 0.00 0.00 99.00
- 06:29:42 PM 0 0.00 0.00 0.33 0.00 0.00 99.67
- 06:29:45 PM 0 0.67 0.00 0.33 0.00 0.00 99.00
- 06:29:48 PM 0 1.00 0.00 0.33 0.33 0.00 98.34
- Average: 0 1.07 0.00 0.33 0.07 0.00 98.53
這個(gè)輸出是對(duì)系統(tǒng)的第一顆CPU的信息統(tǒng)計(jì),需要注意的是,sar中對(duì)CPU的計(jì)數(shù)是從0開(kāi)始的,因此,“sar -P 0 3 5”表示對(duì)系統(tǒng)的第一顆CPU進(jìn)行信息統(tǒng)計(jì),“sar -P 4 3 5”則表示對(duì)系統(tǒng)的第五顆CPU進(jìn)行統(tǒng)計(jì)。依次類(lèi)推。可以看出,上面的系統(tǒng)有八顆CPU。
1.3 iostat命令
iostat指令主要用于統(tǒng)計(jì)磁盤(pán)IO狀態(tài),但是也能查看CPU的使用信息,它的局限性是只能顯示系統(tǒng)所有CPU的平均信息,看下面的一個(gè)輸出:
- [root@webserver ~]# iostat -c
- Linux 2.6.9-42.ELsmp (webserver) 11/29/2008 _i686_ (8 CPU)
- avg-cpu: %user %nice %system %iowait %steal %idle
- 2.52 0.00 0.30 0.24 0.00 96.96
在這里,我們使用了“-c”參數(shù),只顯示系統(tǒng)CPU的統(tǒng)計(jì)信息,輸出中每項(xiàng)代表的含義與sar命令的輸出項(xiàng)完全相同,不再詳述。
1.4 uptime命令
uptime是監(jiān)控系統(tǒng)性能最常用的一個(gè)命令,主要用來(lái)統(tǒng)計(jì)系統(tǒng)當(dāng)前的運(yùn)行狀況,輸出的信息依次為:系統(tǒng)現(xiàn)在的時(shí)間、系統(tǒng)從上次開(kāi)機(jī)到現(xiàn)在運(yùn)行了多長(zhǎng)時(shí)間、系統(tǒng)目前有多少登陸用戶(hù)、系統(tǒng)在一分鐘內(nèi)、五分鐘內(nèi)、十五分鐘內(nèi)的平均負(fù)載??聪旅娴囊粋€(gè)輸出:
- [root@webserver ~]# uptime
- 18:52:11 up 27 days, 19:44, 2 users, load average: 0.12, 0.08, 0.08
這里需要注意的是load average這個(gè)輸出值,這三個(gè)值的大小一般不能大于系統(tǒng)CPU的個(gè)數(shù),例如,本輸出中系統(tǒng)有8個(gè)CPU,如果load average的三個(gè)值長(zhǎng)期大于8時(shí),說(shuō)明CPU很繁忙,負(fù)載很高,可能會(huì)影響系統(tǒng)性能,但是偶爾大于8時(shí),倒不用擔(dān)心,一般不會(huì)影響系統(tǒng)性能。相反,如果load average的輸出值小于CPU的個(gè)數(shù),則表示CPU還有空閑的時(shí)間片,比如本例中的輸出,CPU是非??臻e的。
1.5 本節(jié)小結(jié)
上面介紹了檢查CPU使用狀況的四個(gè)命令,通過(guò)這些命令需要了解的是:系統(tǒng)CPU是否出現(xiàn)性能瓶頸,也就是說(shuō),以上這些命令只能查看CPU是否繁忙,負(fù)載是否過(guò)大,但是無(wú)法知道CPU為何負(fù)載過(guò)大,因而,判斷系統(tǒng)CPU出現(xiàn)問(wèn)題后,要結(jié)合top、ps等命令進(jìn)一步檢查是由那些進(jìn)程導(dǎo)致CPU負(fù)載過(guò)大的。引起CPU資源緊缺的原因可能是應(yīng)用程序不合理造成的,也可能是硬件資源匱乏引起的,所以,要具體問(wèn)題具體分析,或者優(yōu)化應(yīng)用程序,或者增加系統(tǒng)CPU資源。
2 內(nèi)存性能評(píng)估
內(nèi)存的管理和優(yōu)化是系統(tǒng)性能優(yōu)化的一個(gè)重要部分,內(nèi)存資源的充足與否直接影響應(yīng)用系統(tǒng)的使用性能,在進(jìn)行內(nèi)存優(yōu)化之前,一定要熟悉linux的內(nèi)存管理機(jī)制,這一點(diǎn)我們?cè)谇懊娴恼鹿?jié)已經(jīng)有深入講述,本節(jié)的重點(diǎn)是如何通過(guò)系統(tǒng)命令監(jiān)控linux系統(tǒng)的內(nèi)存使用狀況。
2.1 free 命令
free是監(jiān)控linux內(nèi)存使用狀況最常用的指令,看下面的一個(gè)輸出:
- [root@webserver ~]# free -m
- total used free shared buffers cached
- Mem: 8111 7185 925 0 243 6299
- -/+ buffers/cache: 643 7468
- Swap: 8189 0 8189
“free –m”表示以M為單位查看內(nèi)存使用情況,在這個(gè)輸出中,我們重點(diǎn)關(guān)注的應(yīng)該是free列與cached列的輸出值,由輸出可知,此系統(tǒng)共8G內(nèi)存,系統(tǒng)空閑內(nèi)存還有925M,其中,Buffer Cache占用了243M,Page Cache占用了6299M,由此可知系統(tǒng)緩存了很多的文件和目錄,而對(duì)于應(yīng)用程序來(lái)說(shuō),可以使用的內(nèi)存還有7468M,當(dāng)然這個(gè)7468M包含了Buffer Cache和Page Cache的值。在swap項(xiàng)可以看出,交換分區(qū)還未使用。所以從應(yīng)用的角度來(lái)說(shuō),此系統(tǒng)內(nèi)存資源還非常充足。
一般有這樣一個(gè)經(jīng)驗(yàn)公式:應(yīng)用程序可用內(nèi)存/系統(tǒng)物理內(nèi)存>70%時(shí),表示系統(tǒng)內(nèi)存資源非常充足,不影響系統(tǒng)性能,應(yīng)用程序可用內(nèi)存/系統(tǒng)物理內(nèi)存<20%時(shí),表示系統(tǒng)內(nèi)存資源緊缺,需要增加系統(tǒng)內(nèi)存,20%<應(yīng)用程序可用內(nèi)存/系統(tǒng)物理內(nèi)存<70%時(shí),表示系統(tǒng)內(nèi)存資源基本能滿(mǎn)足應(yīng)用需求,暫時(shí)不影響系統(tǒng)性能。
free命令還可以適時(shí)的監(jiān)控內(nèi)存的使用狀況,使用“-s”參數(shù)可以在指定的時(shí)間段內(nèi)不間斷的監(jiān)控內(nèi)存的使用情況:
- [root@webserver ~]# free -b -s 5
- total used free shared buffers cached
- Mem: 8505901056 7528706048 977195008 0 260112384 6601158656
- -/+ buffers/cache: 667435008 7838466048
- Swap: 8587149312 163840 8586985472
- total used free shared buffers cached
- Mem: 8505901056 7526936576 978964480 0 260128768 6601142272
- -/+ buffers/cache: 665665536 7840235520
- Swap: 8587149312 163840 8586985472
- total used free shared buffers cached
- Mem: 8505901056 7523987456 981913600 0 260141056 6601129984
- -/+ buffers/cache: 662716416 7843184640
- Swap: 8587149312 163840 8586985472
其中,“-b”表示以千字節(jié)(也就是1024字節(jié)為單位)來(lái)顯示內(nèi)存使用情況。
2.2 通過(guò)watch與free相結(jié)合動(dòng)態(tài)監(jiān)控內(nèi)存狀況
watch是一個(gè)非常有用的命令,幾乎每個(gè)linux發(fā)行版都帶有這個(gè)工具,通過(guò)watch,可以動(dòng)態(tài)的監(jiān)控命令的運(yùn)行結(jié)果,省去手動(dòng)執(zhí)行的麻煩。
可以在watch后面跟上需要運(yùn)行的命令,watch就會(huì)自動(dòng)重復(fù)去運(yùn)行這個(gè)命令,默認(rèn)是2秒鐘執(zhí)行一次,并把執(zhí)行的結(jié)果更新在屏幕上。例如:
- [root@webserver ~]# watch -n 3 -d free
- Every 3.0s: free Sun Nov 30 16:23:20 2008
- total used free shared buffers cached
- Mem: 8306544 7349548 956996 0 203296 6500024
- -/+ buffers/cache: 646228 7660316
- Swap: 8385888 160 8385728
其中,“-n”指定重復(fù)執(zhí)行的時(shí)間,“-d”表示高亮顯示變動(dòng)。
2.3 vmstat命令監(jiān)控內(nèi)存
vmstat命令在監(jiān)控系統(tǒng)內(nèi)存方面功能強(qiáng)大,請(qǐng)看下面的一個(gè)輸出:
- procs ———–memory———- —swap– —–io—- –system– —-cpu—-
- r b swpd free buff cache si so bi bo in cs us sy id wa
- 0 0 906440 22796 155616 1325496 340 180 2 4 1 4 80 0 10 10
- 0 0 906440 42796 155616 1325496 320 289 0 54 1095 287 70 15 0 15
- 0 0 906440 42884 155624 1325748 236 387 2 102 1064 276 78 2 5 15
對(duì)于內(nèi)存的監(jiān)控,在vmstat中重點(diǎn)關(guān)注的是swpd、si和so行,從這個(gè)輸出可以看出,此系統(tǒng)內(nèi)存資源緊缺,swpd占用了900M左右內(nèi)存,si和so占用很大,而由于系統(tǒng)內(nèi)存的緊缺,導(dǎo)致出現(xiàn)15%左右的系統(tǒng)等待,此時(shí)增加系統(tǒng)的內(nèi)存是必須要做的。
2.4 sar -r命令組合
sar命令也可以監(jiān)控linux的內(nèi)存使用狀況,可以通過(guò)“sar –r”組合查看系統(tǒng)內(nèi)存和交換空間的使用率。請(qǐng)看下面的一個(gè)輸出:
- [root@webserver ~]# sar -r 2 3
- Linux 2.6.9-42.ELsmp (webserver) 11/30/2008 _i686_ (8 CPU)
- 09:57:33 PM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit
- 09:57:35 PM 897988 7408556 89.19 249428 6496532 786556 4.71
- 09:57:37 PM 898564 7407980 89.18 249428 6496532 784276 4.70
- 09:57:39 PM 899196 7407348 89.17 249440 6496520 782132 4.69
- Average: 898583 7407961 89.18 249432 6496528 784321 4.70
其中:
Kbmemfree表示空閑物理內(nèi)存大小,kbmemused表示已使用的物理內(nèi)存空間大小,%memused表示已使用內(nèi)存占總內(nèi)存大小的百分比,kbbuffers和kbcached分別表示Buffer Cache和Page Cache的大小,kbcommit和%commit分別表示應(yīng)用程序當(dāng)前使用的內(nèi)存大小和使用百分比。
可以看出sar的輸出其實(shí)與free的輸出完全對(duì)應(yīng),不過(guò)sar更加人性化,不但給出了內(nèi)存使用量,還給出了內(nèi)存使用的百分比以及統(tǒng)計(jì)的平均值。從%commit項(xiàng)可知,此系統(tǒng)目前內(nèi)存資源充足。
2.5 本節(jié)小結(jié)
上面介紹了內(nèi)存監(jiān)控常用的幾個(gè)指令以及一些經(jīng)驗(yàn)規(guī)則,其實(shí)現(xiàn)在的系統(tǒng)在內(nèi)存方面出現(xiàn)的瓶頸已經(jīng)很少,因?yàn)閮?nèi)存價(jià)格很低,充足的內(nèi)存已經(jīng)完全能滿(mǎn)足應(yīng)用程序和系統(tǒng)本身的需要,如果系統(tǒng)在內(nèi)存方面出現(xiàn)瓶頸,很大的可能是應(yīng)用程序本身的問(wèn)題造成的。
3 磁盤(pán)I/O性能評(píng)估
在對(duì)磁盤(pán)I/O性能做評(píng)估之前,必須知道的幾個(gè)方面是:
- 熟悉RAID存儲(chǔ)方式,可以根據(jù)應(yīng)用的不同,選擇不同的RAID方式,例如,如果一個(gè)應(yīng)用經(jīng)常有大量的讀操作,可以選擇RAID5方式構(gòu)建磁盤(pán)陣列存儲(chǔ)數(shù)據(jù),如果應(yīng)用有大量的、頻繁的寫(xiě)操作,可以選擇raid0存取方式,如果應(yīng)用對(duì)數(shù)據(jù)安全要求很高,同時(shí)對(duì)讀寫(xiě)也有要求的話(huà),可以考慮raid01存取方式等等。
- 盡可能用內(nèi)存的讀寫(xiě)代替直接磁盤(pán)I/O,使頻繁訪問(wèn)的文件或數(shù)據(jù)放入內(nèi)存中進(jìn)行操作處理,因?yàn)閮?nèi)存讀寫(xiě)操作比直接磁盤(pán)讀寫(xiě)的效率要高千倍。
- 將經(jīng)常進(jìn)行讀寫(xiě)的文件與長(zhǎng)期不變的文件獨(dú)立出來(lái),分別放置到不同的磁盤(pán)設(shè)備上。
- 對(duì)于寫(xiě)操作頻繁的數(shù)據(jù),可以考慮使用裸設(shè)備代替文件系統(tǒng)。這里簡(jiǎn)要講述下文件系統(tǒng)與裸設(shè)備的對(duì)比:
使用裸設(shè)備的優(yōu)點(diǎn)有:
- 數(shù)據(jù)可以直接讀寫(xiě),不需要經(jīng)過(guò)操作系統(tǒng)級(jí)的緩存,節(jié)省了內(nèi)存資源,避免了內(nèi)存資源爭(zhēng)用。
- 避免了文件系統(tǒng)級(jí)的維護(hù)開(kāi)銷(xiāo),比如文件系統(tǒng)需要維護(hù)超級(jí)塊、I-node等。
- 避免了操作系統(tǒng)的cache預(yù)讀功能,減少了I/O請(qǐng)求。
使用裸設(shè)備的缺點(diǎn)是:
- 數(shù)據(jù)管理、空間管理不靈活,需要很專(zhuān)業(yè)的人來(lái)操作。
其實(shí)裸設(shè)備的優(yōu)點(diǎn)就是文件系統(tǒng)的缺點(diǎn),反之也是如此,這就需要我們做出合理的規(guī)劃和衡量,根據(jù)應(yīng)用的需求,做出對(duì)應(yīng)的策略。
下面接著介紹對(duì)磁盤(pán)IO的評(píng)估標(biāo)準(zhǔn)。
3.1 sar -d命令組合
通過(guò)“sar –d”組合,可以對(duì)系統(tǒng)的磁盤(pán)IO做一個(gè)基本的統(tǒng)計(jì),請(qǐng)看下面的一個(gè)輸出:
- [root@webserver ~]# sar -d 2 3
- Linux 2.6.9-42.ELsmp (webserver) 11/30/2008 _i686_ (8 CPU)
- 11:09:33 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
- 11:09:35 PM dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 11:09:35 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
- 11:09:37 PM dev8-0 1.00 0.00 12.00 12.00 0.00 0.00 0.00 0.00
- 11:09:37 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
- 11:09:39 PM dev8-0 1.99 0.00 47.76 24.00 0.00 0.50 0.25 0.05
- Average: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
- Average: dev8-0 1.00 0.00 19.97 20.00 0.00 0.33 0.17 0.02
對(duì)上面每項(xiàng)的輸出解釋如下:
- DEV表示磁盤(pán)設(shè)備名稱(chēng)。
- tps表示每秒到物理磁盤(pán)的傳送數(shù),也就是每秒的I/O流量。一個(gè)傳送就是一個(gè)I/O請(qǐng)求,多個(gè)邏輯請(qǐng)求可以被合并為一個(gè)物理I/O請(qǐng)求。
- d_sec/s表示每秒從設(shè)備讀取的扇區(qū)數(shù)(1扇區(qū)=512字節(jié))。
- wr_sec/s表示每秒寫(xiě)入設(shè)備的扇區(qū)數(shù)目。
- avgrq-sz表示平均每次設(shè)備I/O操作的數(shù)據(jù)大小(以扇區(qū)為單位)。
- avgqu-sz表示平均I/O隊(duì)列長(zhǎng)度。
- await表示平均每次設(shè)備I/O操作的等待時(shí)間(以毫秒為單位)。
- svctm表示平均每次設(shè)備I/O操作的服務(wù)時(shí)間(以毫秒為單位)。
- %util表示一秒中有百分之幾的時(shí)間用于I/O操作。
Linux中I/O請(qǐng)求系統(tǒng)與現(xiàn)實(shí)生活中超市購(gòu)物排隊(duì)系統(tǒng)有很多類(lèi)似的地方,通過(guò)對(duì)超市購(gòu)物排隊(duì)系統(tǒng)的理解,可以很快掌握l(shuí)inux中I/O運(yùn)行機(jī)制。比如:
avgrq-sz類(lèi)似與超市排隊(duì)中每人所買(mǎi)東西的多少。
avgqu-sz類(lèi)似與超市排隊(duì)中單位時(shí)間內(nèi)平均排隊(duì)的人數(shù)。
await類(lèi)似與超市排隊(duì)中每人的等待時(shí)間。
svctm類(lèi)似與超市排隊(duì)中收銀員的收款速度。
%util類(lèi)似與超市收銀臺(tái)前有人排隊(duì)的時(shí)間比例。
對(duì)以磁盤(pán)IO性能,一般有如下評(píng)判標(biāo)準(zhǔn):
正常情況下svctm應(yīng)該是小于await值的,而svctm的大小和磁盤(pán)性能有關(guān),CPU、內(nèi)存的負(fù)荷也會(huì)對(duì)svctm值造成影響,過(guò)多的請(qǐng)求也會(huì)間接的導(dǎo)致svctm值的增加。
await值的大小一般取決與svctm的值和I/O隊(duì)列長(zhǎng)度以及I/O請(qǐng)求模式,如果svctm的值與await很接近,表示幾乎沒(méi)有I/O等待,磁盤(pán)性能很好,如果await的值遠(yuǎn)高于svctm的值,則表示I/O隊(duì)列等待太長(zhǎng),系統(tǒng)上運(yùn)行的應(yīng)用程序?qū)⒆兟?,此時(shí)可以通過(guò)更換更快的硬盤(pán)來(lái)解決問(wèn)題。
%util項(xiàng)的值也是衡量磁盤(pán)I/O的一個(gè)重要指標(biāo),如果%util接近100%,表示磁盤(pán)產(chǎn)生的I/O請(qǐng)求太多,I/O系統(tǒng)已經(jīng)滿(mǎn)負(fù)荷的在工作,該磁盤(pán)可能存在瓶頸。長(zhǎng)期下去,勢(shì)必影響系統(tǒng)的性能,可以通過(guò)優(yōu)化程序或者通過(guò)更換更高、更快的磁盤(pán)來(lái)解決此問(wèn)題。
3.2 iostat –d命令組合
通過(guò)“iostat –d”命令組合也可以查看系統(tǒng)磁盤(pán)的使用狀況,請(qǐng)看如下輸出:
- [root@webserver ~]# iostat -d 2 3
- inux 2.6.9-42.ELsmp (webserver) 12/01/2008 _i686_ (8 CPU)
- Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
- da 1.87 2.58 114.12 6479462 286537372
- Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
- da 0.00 0.00 0.00 0 0
- Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
- da 1.00 0.00 12.00 0 24
對(duì)上面每項(xiàng)的輸出解釋如下:
- Blk_read/s表示每秒讀取的數(shù)據(jù)塊數(shù)。
- Blk_wrtn/s表示每秒寫(xiě)入的數(shù)據(jù)塊數(shù)。
- Blk_read表示讀取的所有塊數(shù)
- Blk_wrtn表示寫(xiě)入的所有塊數(shù)。
這里需要注意的一點(diǎn)是:上面輸出的第一項(xiàng)是系統(tǒng)從啟動(dòng)以來(lái)到統(tǒng)計(jì)時(shí)的所有傳輸信息,從第二次輸出的數(shù)據(jù)才代表在檢測(cè)的時(shí)間段內(nèi)系統(tǒng)的傳輸值。
可以通過(guò)Blk_read/s和Blk_wrtn/s的值對(duì)磁盤(pán)的讀寫(xiě)性能有一個(gè)基本的了解,如果Blk_wrtn/s值很大,表示磁盤(pán)的寫(xiě)操作很頻繁,可以考慮優(yōu)化磁盤(pán)或者優(yōu)化程序,如果Blk_read/s值很大,表示磁盤(pán)直接讀取操作很多,可以將讀取的數(shù)據(jù)放入內(nèi)存中進(jìn)行操作。對(duì)于這兩個(gè)選項(xiàng)的值沒(méi)有一個(gè)固定的大小,根據(jù)系統(tǒng)應(yīng)用的不同,會(huì)有不同的值,但是有一個(gè)規(guī)則還是可以遵循的:長(zhǎng)期的、超大的數(shù)據(jù)讀寫(xiě),肯定是不正常的,這種情況一定會(huì)影響系統(tǒng)性能。
“iostat –x”組合還提供了對(duì)每個(gè)磁盤(pán)的單獨(dú)統(tǒng)計(jì),如果不指定磁盤(pán),默認(rèn)是對(duì)所有磁盤(pán)進(jìn)行統(tǒng)計(jì),請(qǐng)看下面的一個(gè)輸出:
- [root@webserver ~]# iostat -x /dev/sda 2 3
- Linux 2.6.9-42.ELsmp (webserver) 12/01/2008 _i686_ (8 CPU)
- avg-cpu: %user %nice %system %iowait %steal %idle
- 2.45 0.00 0.30 0.24 0.00 97.03
- Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
- sda 0.01 12.48 0.10 1.78 2.58 114.03 62.33 0.07 38.39 1.30 0.24
- avg-cpu: %user %nice %system %iowait %steal %idle
- 3.97 0.00 1.83 8.19 0.00 86.14
- Device:rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
- sda 0.00 195.00 0.00 18.00 0.00 1704.00 94.67 0.04 2.50 0.11 0.20
- avg-cpu: %user %nice %system %iowait %steal %idle
- 4.04 0.00 1.83 8.01 0.00 86.18
- Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
- sda 0.00 4.50 0.00 7.00 0.00 92.00 13.14 0.01 0.79 0.14 0.10
這個(gè)輸出基本與“sar –d”相同,需要說(shuō)明的幾個(gè)選項(xiàng)的含義為:
- rrqm/s表示每秒進(jìn)行merged的讀操作數(shù)目。
- wrqm/s表示每秒進(jìn)行 merge 的寫(xiě)操作數(shù)目。
- r/s表示每秒完成讀I/O設(shè)備的次數(shù)。
- w/s表示每秒完成寫(xiě)I/O設(shè)備的次數(shù)。
- rsec/s表示每秒讀取的扇區(qū)數(shù)。
- wsec/s表示每秒寫(xiě)入的扇區(qū)數(shù)。
3.3 vmstat –d組合
通過(guò)“vmstat –d”組合也可以查看磁盤(pán)的統(tǒng)計(jì)數(shù)據(jù),情況下面的一個(gè)輸出:
- [root@webserver ~]# vmstat -d 3 2|grep sda
- disk- ————reads———— ————writes———– —–IO——
- total merged sectors ms total merged sectors ms cur sec
- sda 239588 29282 6481862 1044442 4538678 32387680 295410812 186025580 0 6179
- disk- ————reads———— ————writes———– —–IO——
- total merged sectors ms total merged sectors ms cur sec
- sda 239588 29282 6481862 1044442 4538680 32387690 295410908 186025581 0 6179
這個(gè)輸出顯示了磁盤(pán)的reads、writes和IO的使用狀況。
3.4 本節(jié)小結(jié)
上面主要講解了對(duì)磁盤(pán)I/O的性能評(píng)估,其實(shí)衡量磁盤(pán)I/O好壞是多方面的,有應(yīng)用程序本身的,也有硬件設(shè)計(jì)上的,還有系統(tǒng)自身配置的問(wèn)題等,要解決I/O的瓶頸,關(guān)鍵是要提高I/O子系統(tǒng)的執(zhí)行效率。例如,首要要從應(yīng)用程序上對(duì)磁盤(pán)讀寫(xiě)進(jìn)行優(yōu)化,能夠放到內(nèi)存執(zhí)行的操作,盡量不要放到磁盤(pán),同時(shí)對(duì)磁盤(pán)存儲(chǔ)方式進(jìn)行合理規(guī)劃,選擇適合自己的RAID存取方式,最后,在系統(tǒng)級(jí)別上,可以選擇適合自身應(yīng)用的文件系統(tǒng),必要時(shí)使用裸設(shè)備提高讀寫(xiě)性能。
4 網(wǎng)絡(luò)性能評(píng)估
網(wǎng)絡(luò)性能的好壞直接影響應(yīng)用程序?qū)ν馓峁┓?wù)的穩(wěn)定性和可靠性,監(jiān)控網(wǎng)絡(luò)性能,可以從以下幾個(gè)方面進(jìn)行管理和優(yōu)化。
4.1 通過(guò)ping命令檢測(cè)網(wǎng)絡(luò)的連通性
如果發(fā)現(xiàn)網(wǎng)絡(luò)反應(yīng) 緩慢,或者連接中斷,可以通過(guò)ping來(lái)測(cè)試網(wǎng)絡(luò)的連通情況,請(qǐng)看下面的一個(gè)輸出:
- [root@webserver ~]# ping 10.10.1.254
- PING 10.10.1.254 (10.10.1.254) 56(84) bytes of data.
- 64 bytes from 10.10.1.254: icmp_seq=0 ttl=64 time=0.235 ms
- 64 bytes from 10.10.1.254: icmp_seq=1 ttl=64 time=0.164 ms
- 64 bytes from 10.10.1.254: icmp_seq=2 ttl=64 time=0.210 ms
- 64 bytes from 10.10.1.254: icmp_seq=3 ttl=64 time=0.178 ms
- 64 bytes from 10.10.1.254: icmp_seq=4 ttl=64 time=0.525 ms
- 64 bytes from 10.10.1.254: icmp_seq=5 ttl=64 time=0.571 ms
- 64 bytes from 10.10.1.254: icmp_seq=6 ttl=64 time=0.220 ms
- — 10.10.1.254 ping statistics —
- 7 packets transmitted, 7 received, 0% packet loss, time 6000ms
- rtt min/avg/max/mdev = 0.164/0.300/0.571/0.159 ms, pipe 2
在這個(gè)輸出中,time值顯示了兩臺(tái)主機(jī)之間的網(wǎng)絡(luò)延時(shí)情況,如果此值很大,則表示網(wǎng)絡(luò)的延時(shí)很大,單位為毫秒。在這個(gè)輸出的最后,是對(duì)上面輸出信息的一個(gè)總結(jié),packet loss表示網(wǎng)絡(luò)的丟包率,此值越小,表示網(wǎng)絡(luò)的質(zhì)量越高。
4.2 通過(guò)netstat –i組合檢測(cè)網(wǎng)絡(luò)接口狀況
netstat命令提供了網(wǎng)絡(luò)接口的詳細(xì)信息,請(qǐng)看下面的輸出:
- [root@webserver ~]# netstat -i
- Kernel Interface table
- Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
- eth0 1500 0 1313129253 0 0 0 1320686497 0 0 0 BMRU
- eth1 1500 0 494902025 0 0 0 292358810 0 0 0 BMRU
- lo 16436 0 41901601 0 0 0 41901601 0 0 0 LRU
對(duì)上面每項(xiàng)的輸出解釋如下:
- Iface表示網(wǎng)絡(luò)設(shè)備的接口名稱(chēng)。
- MTU表示最大傳輸單元,單位字節(jié)。
- RX-OK/TX-OK表示已經(jīng)準(zhǔn)確無(wú)誤的接收/發(fā)送了多少數(shù)據(jù)包。
- RX-ERR/TX-ERR表示接收/發(fā)送數(shù)據(jù)包時(shí)產(chǎn)生了多少錯(cuò)誤。
- RX-DRP/TX-DRP表示接收/發(fā)送數(shù)據(jù)包時(shí)丟棄了多少數(shù)據(jù)包。
- RX-OVR/TX-OVR表示由于誤差而遺失了多少數(shù)據(jù)包。
- Flg表示接口標(biāo)記,其中:
- L:表示該接口是個(gè)回環(huán)設(shè)備。
- B:表示設(shè)置了廣播地址。
- M:表示接收所有數(shù)據(jù)包。
- R:表示接口正在運(yùn)行。
- U:表示接口處于活動(dòng)狀態(tài)。
- O:表示在該接口上禁用arp。
- P:表示一個(gè)點(diǎn)到點(diǎn)的連接。
正常情況下,RX-ERR/TX-ERR、RX-DRP/TX-DRP和RX-OVR/TX-OVR的值都應(yīng)該為0,如果這幾個(gè)選項(xiàng)的值不為0,并且很大,那么網(wǎng)絡(luò)質(zhì)量肯定有問(wèn)題,網(wǎng)絡(luò)傳輸性能也一定會(huì)下降。
當(dāng)網(wǎng)絡(luò)傳輸存在問(wèn)題是,可以檢測(cè)網(wǎng)卡設(shè)備是否存在故障,如果可能,可以升級(jí)為千兆網(wǎng)卡或者光纖網(wǎng)絡(luò),還可以檢查網(wǎng)絡(luò)部署環(huán)境是否合理。
4.3 通過(guò)netstat –r組合檢測(cè)系統(tǒng)的路由表信息
在網(wǎng)絡(luò)不通,或者網(wǎng)絡(luò)異常時(shí),首先想到的就是檢查系統(tǒng)的路由表信息,“netstat –r”的輸出結(jié)果與route命令的輸出完全相同,請(qǐng)看下面的一個(gè)實(shí)例:
- [root@webserver ~]# netstat -r
- Kernel IP routing table
- Destination Gateway Genmask Flags MSS Window irtt Iface
- 10.10.1.0 * 255.255.255.0 U 0 0 0 eth0
- 192.168.200.0 * 255.255.255.0 U 0 0 0 eth1
- 169.254.0.0 * 255.255.0.0 U 0 0 0 eth1
- default 10.10.1.254 0.0.0.0 UG 0 0 0 eth0
關(guān)于輸出中每項(xiàng)的具體含義,已經(jīng)在前面章節(jié)進(jìn)行過(guò)詳細(xì)介紹,這里不再多講,這里我們重點(diǎn)關(guān)注的是default行對(duì)應(yīng)的值,default項(xiàng)表示系統(tǒng)的默認(rèn)路由,對(duì)應(yīng)的網(wǎng)絡(luò)接口為eth0。
4.4 通過(guò)sar –n組合顯示系統(tǒng)的網(wǎng)絡(luò)運(yùn)行狀態(tài)
sar提供四種不同的選項(xiàng)來(lái)顯示網(wǎng)絡(luò)統(tǒng)計(jì)信息,通過(guò)“-n”選項(xiàng)可以指定4個(gè)不同類(lèi)型的開(kāi)關(guān):DEV、EDEV、SOCK和FULL。DEV顯示網(wǎng)絡(luò)接口信息,EDEV顯示關(guān)于網(wǎng)絡(luò)錯(cuò)誤的統(tǒng)計(jì)數(shù)據(jù),SOCK顯示套接字信息,F(xiàn)ULL顯示所有三個(gè)開(kāi)關(guān)。請(qǐng)看下面的一個(gè)輸出:
- [root@webserver ~]# sar -n DEV 2 3
- Linux 2.6.9-42.ELsmp (webserver) 12/01/2008 _i686_ (8 CPU)
- 02:22:31 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
- 02:22:33 PM lo 31.34 31.34 37.53 37.53 0.00 0.00 0.00
- 02:22:33 PM eth0 199.50 279.60 17.29 344.12 0.00 0.00 0.00
- 02:22:33 PM eth1 5.47 4.98 7.03 0.36 0.00 0.00 0.00
- 02:22:33 PM sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 02:22:33 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
- 02:22:35 PM lo 67.66 67.66 74.34 74.34 0.00 0.00 0.00
- 02:22:35 PM eth0 159.70 222.39 19.74 217.16 0.00 0.00 0.00
- 02:22:35 PM eth1 3.48 4.48 0.44 0.51 0.00 0.00 0.00
- 02:22:35 PM sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 02:22:35 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
- 02:22:37 PM lo 4.52 4.52 9.25 9.25 0.00 0.00 0.00
- 02:22:37 PM eth0 102.51 133.67 20.67 116.14 0.00 0.00 0.00
- 02:22:37 PM eth1 27.14 67.34 2.42 89.26 0.00 0.00 0.00
- 02:22:37 PM sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- Average: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
- Average: lo 34.61 34.61 40.48 40.48 0.00 0.00 0.00
- Average: eth0 154.08 212.15 19.23 226.17 0.00 0.00 0.00
- Average: eth1 11.98 25.46 3.30 29.85 0.00 0.00 0.00
- Average: sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
對(duì)上面每項(xiàng)的輸出解釋如下:
- IFACE表示網(wǎng)絡(luò)接口設(shè)備。
- rxpck/s表示每秒鐘接收的數(shù)據(jù)包大小。
- txpck/s表示每秒鐘發(fā)送的數(shù)據(jù)包大小。
- rxkB/s表示每秒鐘接收的字節(jié)數(shù)。
- txkB/s表示每秒鐘發(fā)送的字節(jié)數(shù)。
- rxcmp/s表示每秒鐘接收的壓縮數(shù)據(jù)包。
- txcmp/s表示每秒鐘發(fā)送的壓縮數(shù)據(jù)包。
- rxmcst/s表示每秒鐘接收的多播數(shù)據(jù)包。
通過(guò)“sar –n”的輸出,可以清楚的顯示網(wǎng)絡(luò)接口發(fā)送、接收數(shù)據(jù)的統(tǒng)計(jì)信息。此外還可以通過(guò)“sar -n EDEV 2 3”來(lái)統(tǒng)計(jì)網(wǎng)絡(luò)錯(cuò)誤信息等。
4.5 小結(jié)
本節(jié)通過(guò)幾個(gè)常用的網(wǎng)絡(luò)命令介紹了對(duì)網(wǎng)絡(luò)性能的評(píng)估,事實(shí)上,網(wǎng)絡(luò)問(wèn)題是簡(jiǎn)單而且容易處理的,只要我們根據(jù)上面給出的命令,一般都能迅速定位問(wèn)題。解決問(wèn)題的方法一般是增加網(wǎng)絡(luò)帶寬,或者優(yōu)化網(wǎng)絡(luò)部署環(huán)境。
除了上面介紹的幾個(gè)命令外,排查網(wǎng)絡(luò)問(wèn)題經(jīng)常用到的命令還有traceroute,主要用于跟蹤數(shù)據(jù)包的傳輸路徑,還有nslookup命令,主要用于判斷DNS解析信息。























