Linux Performance Monitoring
這篇文章主要介紹如何運用 Linux 的兩個常用的工具 (vmstat & iostat)
來得知目前 Linux 系統運作的效能,並且舉幾個例子說明如何解讀結果,
並且進一步分析是 CPU , memory or disk 效能瓶頸
記憶體效能瓶頸 vmstat
首先介紹的工具是 vmstat ,該工具可以分析目前系統記憶體與CPU等的狀況。
$ vmstat 5
如何解讀 vmstat 的結果?
Procs
- Procs > r : 有多少的 process 等待 CPU 執行。如果 r 的數值大於 # of CPU,則表示 CPU 效能瓶頸。
- Procs > b: 有多少 process 等待 I/O (磁碟、網路、使用者輸入等)
Memory
- swap > si: how many blocks per second the operating system is swapping in from Disk.
- swap > so: how many blocks per second the operating system is swapping out to disk
- 多半的情況下,這個值 si & so 皆為 0 ,如果超過 > 10 ,表示記憶體效能瓶頸,做很多的 page in/out 的動作。
io
- io > bi : how many blocks per second are read in from (bi) disk
- io > bo: written out to (bo) disk
- 這個值可以佐證得知是否為 Disk I/O 的問題
system
- in: the number of interrupts per second (in)
- cs: the number of context switches per second (cs).
cpu
- us: CPU time spent running user application
- sy: CPU running system (kernel) code
- id: CPU idle
- wa: CPU waiting for I/O
如何觀察 I/O 效能瓶頸 iostat
$ iostat -dx 5
這個結果主要觀察幾個重點,想像 CPU 是收銀機櫃台:
- avgqu-sz: 平均有多少客戶在等待結帳
- await: 平均每個客戶等待結帳的時間 (mili sec)
- svctm: 平均每個櫃台處理每個客戶的時間 (不包含等待時間)
- %util: 超過 80% 表示 I/O 效能瓶頸
接著讓我們看幾個個案
CPU Bound
用 vmstat 觀察之後,如果是 CPU 忙碌的情況,通常會有下列特徵
- r: # of process waiting for CPU > # of CPU,有許多的 process 等待 CPU 執行
- CPU > us: CPU 主要花在 user application 的比率很高,這個例子中, 89%, 90%, 88%
補充說明什麼是 cs (context switch)
如果 CPU 要執行的資料沒有在記憶體中,那麼該 process 就會到 disk 讀取,並且等待 disk 讀取完成。這個動作就叫做 context switch。
另外看到 iostat的狀態,從上面這個圖中,通常我們會閱讀 %util , 這個例子中 47% 45% 不算很高的磁碟讀取,但是也表示有一定的 disk I/O 。如果該值達到 100%,就表示磁碟效能瓶頸。
I/O Bound 個案
這個例子,我們執行 vmstat 與iostat,比較明顯的值是 iostat 中 %util 超過 100%
補充說明的是:通常磁碟效能瓶頸多半會發生在 “讀取” 而非 “寫入”
因為讀取,通常是要讀完之後,process 才能夠繼續進行接下來的工作
而寫入,通常是可以延遲讀寫,或是批次等到一定時間或是量之後再寫入磁碟。
Memory swap 的狀況
如果有 memory swap 的情況,最直接的方式就是看 Swap > si/so
這兩個值 si/so 如果 > 0 ,則表示有 memory swap 的狀況。
接著可以觀察:
- b: # of process waiting for disk IO
- System/cs: context switch
因為磁碟讀取,會導致更多的 disk I/O wait 與 context switch 增加。
- wa: CPU waiting on I/O
這個例子中,可以看到 22 -> 47 -> 77 ,I/O wait 越來越增加的趨勢。
Idle的情況
當電腦不忙碌的情況下,有幾個值會接近 0
procs > b: 接近 0,因為沒有 process 執行
procs > r: 接近 0,因為沒有 process 執行
cpu > us/sy: 接近 0,因為不管是 user mode or system mode 都沒有 cpu 使用
cpu > id: Idle 會接近 100。表示 CPU 100% idle
摘要
CPU
- 如果 r 的數值大於 # of CPU,則表示 CPU 效能瓶頸。
us: CPU time spent running user application
sy: CPU running system (kernel) code
Memory
- 多半的情況下,這個值 si & so 皆為 0
Disk IO
- in: the number of interrupts per second (in)
cs: the number of context switches per second (cs).
io > bi : how many blocks per second are read in from (bi) disk
io > bo: written out to (bo) disk - %util: 超過 80% 表示 I/O 效能瓶頸