Linux System and Performance Monitoring(I/O篇)

6.0 I/O 監控介紹mysql

磁盤I/O 子系統是Linux 系統中最慢的部分.這個主要是歸於CPU到物理操做磁盤之間距離(譯註:盤片旋轉以及尋道).若是拿讀取磁盤和內存的時間做比較就是分鐘級到秒級,這就像 7天和7分鐘的區別.所以本質上,Linux 內核就是要最低程度的下降I/O 數.本章將訴述內核在磁盤和內存之間處理數據的這個過程當中,哪些地方會產生I/O.ios

6.1 讀和寫數據 - 內存頁
Linux 內核將硬盤I/O 進行分頁,多數Linux 系統的默認頁大小爲4K.讀和寫磁盤塊進出到內存都爲4K 頁大小.你可使用time 這個命令加-v 參數,來檢查你係統中設置的頁大小:sql

[root @monitor ~ ] # /usr/bin/time -v date
Fri Sep 25 16: 46: 35 CST 2009
Command being timed: "date"
User time (seconds ): 0.00
System time (seconds ): 0.00
Percent of CPU this job got: ? %
Elapsed ( wall clock ) time (h:mm:ss or m:ss ): 0: 00.00
Average shared text size (kbytes ): 0
Average unshared data size (kbytes ): 0
Average stack size (kbytes ): 0
Average total size (kbytes ): 0
Maximum resident set size (kbytes ): 0
Average resident set size (kbytes ): 0
Major (requiring I /O ) page faults: 0
Minor (reclaiming a frame ) page faults: 183
Voluntary context switches: 1
Involuntary context switches: 1
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes ): 4096
Exit status: 0

6.2 Major and Minor Page Faults(譯註:主要頁錯誤和次要頁錯誤)數據庫

Linux,相似多數的UNIX 系統,使用一個虛擬內存層來映射硬件地址空間.當一個進程被啓動,內核先掃描CPU caches和物理內存.若是進程須要的數據在這2個地方都沒找到,就須要從磁盤上讀取,此時內核過程就是major page fault(MPF).MPF 要求磁盤子系統檢索頁並緩存進RAM.api

一旦內存頁被映射進內存的buffer cache(buff)中,內核將嘗試從內存中讀取或寫入,此時內核過程就是minor page fault(MnPF).與在磁盤上操做相比,MnPF 經過反覆使用內存中的內存頁就大大的縮短了內核時間.緩存

如下的例子,使用time 命令驗證了,當進程啓動後,MPF 和 MnPF 的變化狀況.第一次運行進程,MPF 會更多:bash

# /usr/bin/time -v evolution
Major (requiring I/O) page faults: 163
Minor (reclaiming a frame) page faults: 5918app

第二次再運行時,內核已經不須要進行MPF了,由於進程所需的數據已經在內存中:dom

# /usr/bin/time -v evolution
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 5581ide

6.3 The File Buffer Cache(譯註:文件緩存區)

文件緩存區就是指,內核將MPF 過程最小化,MnPF 過程最大化.隨着系統不斷的產生I/O,buffer cache也將不斷的增長.直到內存不夠,以及系統須要釋放老的內存頁去給其餘用戶進程使用時,系統就會丟棄這些內存頁.結果是,不少sa(譯註:系統管理員)對系統中過少的free memory(譯註:空閒內存)表示擔憂,實際上這是系統更高效的在使用caches.

如下例子,是查看/proc/meminfo 文件:

[root @opt-001 ~ ] # cat /proc/meminfo
MemTotal:      4042656 kB
MemFree:         97600 kB
Buffers:        345260 kB
Cached:        2874712 kB
SwapCached:          0 kB
Active:        2494768 kB
Inactive:      1134932 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:      4042656 kB
LowFree:         97600 kB
SwapTotal:     8193140 kB
SwapFree:      8193040 kB
Dirty:            1252 kB
Writeback:           0 kB
AnonPages:      409484 kB
Mapped:        1253336 kB
Slab:           221056 kB
PageTables:      20172 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:  10214468 kB
Committed_AS:  2218724 kB
VmallocTotal: 34359738367 kB
VmallocUsed:    267224 kB
VmallocChunk: 34359469767 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     2048 kB

能夠看出,這個系統總計有4GB (Memtotal)的可用內存.當前的空閒內存爲96MB (MemFree),有337 MB內存被分配磁盤寫操做(Buffers),還有2.8 GB頁用於讀磁盤(Cached).

內核這樣是經過MnPF機制,而不表明全部的頁都是來自磁盤.經過以上部分,咱們不可能確認系統是否處於瓶頸中.

6.4 Type of Memory Pages

在Linux 內核中,memory pages有3種,分別是:

1,Read Pages - 這些頁經過MPF 從磁盤中讀入,並且是隻讀.這些頁存在於Buffer Cache中以及包括不可以修改的靜態文件,二進制文件,還有庫文件.當內核須要它們時,將讀取到內存中.若是內存不足,內核將釋放它們回空閒列表中.程序再次請求時,則經過MPF 再次讀回內存.

2,Dirty Pages - 這些頁是內核在內存中已經被修改過的數據頁.當這些頁須要同步回磁盤上,由pdflush 負責寫回磁盤.若是內存不足,kswapd (與pdflush 一塊兒)將這些頁寫回到磁盤上並釋放更多的內存.

3,Anonymous Pages - 這些頁屬於某個進程,可是沒有任何磁盤文件和它們有關.他們不能和同步回磁盤.若是內存不足,kswapd 將他們寫入swap 分區上並釋放更多的內存(」swapping」 pages).

6.5 Writing Data Pages Back to Disk

應用程序有不少選擇能夠寫髒頁回磁盤上,可經過I/O 調度器使用 fsync() 或 sync() 這樣的系統函數來實現當即寫回.若是應用程序沒有調用以上函數,pdflush 進程會按期與磁盤進行同步.

# ps -ef | grep pdflush
root 186 6 0 18:04 ? 00:00:00 [pdflush]

7.0 監控 I/O

當以爲系統中出現了I/O 瓶頸時,可使用標準的監控軟件來查找緣由.這些工具包括了top,vmstat,iostat,sar.它們的輸出結果一小部分是很類似,不過每一個也都提供了各自對於性能不一樣方面的解釋.如下章節就將討論哪些狀況會致使I/O 瓶頸的出現.

7.1 Calculating IO’s Per Second(譯註:IOPS 的計算)

每一個I/O 請求到磁盤都須要若干時間.主要是由於磁盤的盤片必須旋轉,機頭必須尋道.磁盤的旋轉經常被稱爲」rotational delay」(RD),機頭的移動稱爲」disk seek」(DS).一個I/O 請求所需的時間計算就是DS加上RD.磁盤的RD 基於設備自身RPM 單位值(譯註:RPM 是Revolutions Perminute的縮寫,是轉/每分鐘,表明了硬盤的轉速).一個RD 就是一個盤片旋轉的半圓.如何計算一個10K RPM設備的RD 值呢:

1, 10000 RPM / 60 seconds (10000/60 = 166 RPS)
2, 轉換爲 166分之1 的值(1/166 = 0.006 seconds/Rotation)
3, 單位轉換爲毫秒(6 MS/Rotation)
4, 旋轉半圓的時間(6/2 = 3MS) 也就是 RD
5, 加上平均3 MS 的尋道時間 (3MS + 3MS = 6MS)
6, 加上2MS 的延遲(6MS + 2MS = 8MS)
7, 1000 MS / 8 MS (1000/8 = 125 IOPS)

每次應用程序產生一個I/O,在10K RPM磁盤上都要花費平均 8MS.在這個固定時間裏,磁盤將盡量且有效率在進行讀寫磁盤.IOPS 能夠計算出大體的I/O 請求數,10K RPM 磁盤有能力提供120-150 次IOPS.評估IOPS 的效能,可用每秒讀寫I/O 字節數除以每秒讀寫IOPS 數得出.

7.2 Random vs Sequential I/O(譯註:隨機/順序 I/O)

per I/O產生的KB 字節數是與系統自己workload相關的,有2種不一樣workload的類型,它們是sequential和random.

7.2.1 Sequential I/O(譯註:順序IO)

iostat 命令提供信息包括IOPS 和每一個I/O 數據處理的總額.可以使用iostat -x 查看.順序的workload是同時讀順序請求大量的數據.這包括的應用,好比有商業數據庫(database)在執行大量的查詢和流媒體服務.在這個 workload 中,KB per I/O 的比率應該是很高的.Sequential workload 是能夠同時很快的移動大量數據.若是每一個I/O 都節省了時間,那就意味了能帶來更多的數據處理.

[root @opt-001 mysql_db ] # iostat -x 1
Linux 2.6.18- 164.el5 (opt-001.jobkoo.com )       09 / 27 / 2009

avg-cpu:  %user   % nice %system %iowait  %steal   %idle
0.69    0.02    1.01    0.15    0.00   98.13

Device:         rrqm /s   wrqm /s   r /s   w /s   rsec /s   wsec /s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.15    36.28  0.75 12.11    27.35   387.62    32.25     0.31   24.33   0.54   0.69
sda1              0.00     0.00  0.00  0.00     0.00     0.00     9.99     0.00    5.29   4.43   0.00
sda2              0.10    17.08  0.40  6.56    10.18   189.16    28.65     0.07    9.96   0.47   0.33
sda3              0.00     0.00  0.00  0.00     0.00     0.00    46.30     0.00   20.87  20.60   0.00
sda4              0.00     0.00  0.00  0.00     0.00     0.00     2.00     0.00   17.20  17.20   0.00
sda5              0.04    19.21  0.36  5.55    17.16   198.46    36.49     0.24   41.25   0.74   0.44

avg-cpu:  %user   % nice %system %iowait  %steal   %idle
0.00    0.00    0.00    0.25    0.00   99.75

Device:         rrqm /s   wrqm /s   r /s   w /s   rsec /s   wsec /s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00    60.00  0.00 114.00     0.00  1392.00    12.21     0.44    3.85   0.16   1.80
sda1              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sda2              0.00    36.00  0.00 83.00     0.00   952.00    11.47     0.38    4.61   0.16   1.30
sda3              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sda4              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sda5              0.00    24.00  0.00 31.00     0.00   440.00    14.19     0.06    1.81   0.16   0.50

avg-cpu:  %user   % nice %system %iowait  %steal   %idle
0.00    0.00    0.00    0.00    0.00  100.00

Device:         rrqm /s   wrqm /s   r /s   w /s   rsec /s   wsec /s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sda1              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sda2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sda3              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sda4              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sda5              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

評估IOPS 的效能,可用每秒讀寫I/O 字節數除以每秒讀寫IOPS 數得出,好比
rkB/s  除以 r/s
wkB/s  除以 w/s

53040/105 = 505KB per I/O
71152/102 = 697KB per I/O
在上面例子可看出,每次循環下,/dev/sda 的per I/O 都在增長.

7.2.2 Random I/O(譯註:隨機IO)

Random的worklaod環境下,不依賴於數據大小的多少,更多依賴的是磁盤的IOPS 數.Web和Mail 服務就是典型的Random workload.I/O 請求內容都很小.Random workload是同時每秒會有更多的請求數產生.因此,磁盤的IOPS 數是關鍵.

# iostat -x 1

avg-cpu: %user % nice %sys %idle
2.04 0.00 97.96 0.00

Device:  rrqm /s  wrqm /s r /s w /s rsec /s wsec /s rkB /s wkB /s avgrq-sz avgqu-sz await svctm %util
/dev /sda 0.00  633.67 3.06 102.31 24.49 5281.63 12.24 2640.82 288.89 73.67 113.89 27.22 50.00
/dev /sda1 0.00   5.10  0.00 2.04  0.00  57.14   0.00   28.57   28.00  1.12  55.00 55.00 11.22
/dev /sda2 0.00 628.57 3.06 100.27 24.49 5224.49 12.24 2612.24 321.50 72.55 121.25 30.63 50.00
/dev /sda3 0.00   0.00  0.00  0.00 0.00   0.00  0.00  0.00       0.00  0.00   0.00  0.00  0.00

avg-cpu: %user % nice %sys %idle
2.15 0.00 97.85 0.00

Device: rrqm /s wrqm /s r /s w /s  rsec /s wsec /s rkB /s wkB /s avgrq-sz avgqu-sz await svctm %util
/dev /sda 0.00  41.94  6.45 130.98 51.61 352.69 25.81 3176.34 19.79  2.90    286.32 7.37 15.05
/dev /sda1 0.00 0.00   0.00   0.00  0.00   0.00  0.00    0.00  0.00  0.00      0.00 0.00  0.00
/dev /sda2 0.00 41.94  4.30 130.98 34.41 352.69 17.20 3176.34 21.18  2.90    320.00 8.24 15.05
/dev /sda3 0.00 0.00   2.15   0.00 17.20   0.00  8.60    0.00  8.00  0.00      0.00 0.00  0.00

計算方式和以前的公式一致:

2640/102 = 23KB per I/O
3176/130 = 24KB per I/O

(譯註:對於順序I/O來講,主要是考慮讀取大量數據的能力即KB per request.對於隨機I/O系統,更須要考慮的是IOPS值)

7.3 When Virtual Memory Kills I/O

若是系統沒有足夠的RAM 響應全部的請求,就會使用到SWAP device.就像使用文件系統I/O,使用SWAP device 代價也很大.若是系統已經沒有物理內存可用,那就都在SWAP disk上建立不少不少的內存分頁,若是同一文件系統的數據都在嘗試訪問SWAP device,那系統將遇到I/O 瓶頸.最終致使系統性能的全面崩潰.若是內存頁不可以及時讀或寫磁盤,它們就一直保留在RAM中.若是保留時間過久,內核又必須釋放內存空間.問題來了,I/O 操做都被阻塞住了,什麼都沒作就被結束了,不可避免地就出現kernel panic和system crash.

下面的vmstat 示範了一個內存不足狀況下的系統:

procs ———–memory———- —swap– —–io—- –system– —-cpu—-
r  b    swpd   free  buff  cache   si   so    bi    bo   in cs   us sy id wa
17  0     1250  3248 45820 1488472    30 132   992    0 2437 7657 23 50  0 23
11  0     1376  3256 45820 1488888    57 245   416    0 2391 7173 10 90  0 0
12  0     1582  1688 45828 1490228    63 131  1348   76 2432 7315 10 90  0 10
12  2     3981  1848 45468 1489824   185 56   2300   68 2478 9149 15 12  0 73
14  2     10385 2400 44484 1489732     0 87   1112   20 2515 11620 0 12  0 88
14  2     12671 2280 43644 1488816    76 51   1812  204 2546 11407 20 45 0 35

這個結果可看出,大量的讀請求回內存(bi),致使了空閒內存在不斷的減小(free).這就使得系統寫入swap device的塊數目(so)和swap 空間(swpd)在不斷增長.同時看到CPU WIO time(wa)百分比很大.這代表I/O 請求已經致使CPU 開始效率低下.

要看swaping 對磁盤的影響,可以使用iostat 檢查swap 分區

首先利用fdisk -l查看一下系統swap是哪一個分區

[root @monitor ~ ] # fdisk -l

Disk /dev /sda: 320.0 GB, 320072933376 bytes
255 heads, 63 sectors /track, 38913 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot      Start         End      Blocks   Id  System
/dev /sda1   *           1          25      200781   83  Linux
/dev /sda2              26        5247    41945715   83  Linux
/dev /sda3            5248        5769     4192965   82  Linux swap / Solaris
/dev /sda4            5770       38913   266229180    5  Extended
/dev /sda5            5770       38913   26622914883  Linux

# iostat -x 1 sda3

avg-cpu: %user % nice %sys %idle
0.00  0.00 100.00 0.00

Device:   rrqm /s wrqm /s  r /s     w /s     rsec /s   wsec /s   rkB /s    wkB /s    avgrq-sz avgqu-sz await   svctm %util
/dev /sda  0.00   1766.67 4866.67 1700.00 38933.33 31200.00 19466.67 15600.00 10.68    6526.67  100.56  5.08  3333.33
/dev /sda1 0.00   833.33  33.33   1700.00 266.67   22933.33 133.33   11466.67 13.38    6133.33  358.46  11.35 1966.67
/dev /sda2 0.00   0.00    4833.33 0.00    38666.67 533.33   19333.33 266.67   8.11     373.33   8.07    6.90  87.00
/dev /sda3 0.00   933.33  0.00    0.00    0.00     7733.33  0.00     3866.67  0.00     20.00    2145.07 7.37  200.00

在這個例子中,swap device(/dev/sda3) 和 file system device(/dev/sda1)在互相做用於I/O. 其中任一個會有很高寫請求(w/s),也會有很高wait time(await),或者較低的服務時間比率(svctm).這代表2個分區之間互有聯繫,互有影響.

7.4 結論

I/O 性能監控包含了如下幾點:

1,當CPU 有等待I/O 狀況時,那說明磁盤處於超負荷狀態. 2,計算你的磁盤可以承受多大的IOPS 數. 3,肯定你的應用是屬於隨機或者順序讀取磁盤. 4,監控磁盤慢須要比較wait time(await) 和 service time(svctm). 5,監控swap 和系統分區,要確保virtual memory不是文件系統I/O 的瓶頸.

相關文章
相關標籤/搜索