一文掌握 Linux 性能分析之 I/O 篇
這是 Linux 性能分析系列的第三篇,前兩篇分别講了 CPU 和 記憶體,本篇來看 IO。
IO 和 存儲密切相關,存儲可以概括為磁盤,記憶體,緩存,三者讀寫的性能差距非常大,磁盤讀寫是毫秒級的(一般 0.1-10ms),記憶體讀寫是微妙級的(一般 0.1-10us),cache 是納秒級的(一般 1-10ns)。但這也是犧牲其他特性為代價的,速度快的,價格越貴,容量也越小。
IO 性能這塊,我們更多關注的是讀寫磁盤的性能。首先,先了解下磁盤的基本資訊。
磁盤基本資訊
fdisk
檢視磁盤資訊,包括磁盤容量,扇區大小,IO 大小等資訊,常用
fdisk -l
檢視:

可以看到 /dev/ 下有一個 40G 的硬碟,一共 8K 多萬個扇區,每個扇區 512位元組,IO 大小也是 512 位元組。
df
檢視磁盤使用情況,通常看磁盤使用率:
磁盤性能分析
主要分析磁盤的讀寫效率(IOPS:每秒讀寫的次數;吞吐量:每秒讀寫的資料量),IO 繁忙程度,及 IO 通路對 CPU 的消耗等性能名額。
vmstat
第一個較為常用的還是這個萬能的 vmstat:
對于 IO,我們常關注三個部分:
- b 值:表示因為 IO 阻塞排隊的任務數
- bi 和 bo 值:表示每秒讀寫磁盤的塊數,bi(block in)是寫磁盤,bo(block out)是讀磁盤。
- wa 值:表示因為 IO 等待(wait)而消耗的 CPU 比例。
一般這幾個值偏大,都意味着系統 IO 的消耗較大,對于讀請求較大的伺服器,b、bo、wa 的值偏大,而寫請求較大的伺服器,b、bi、wa 的值偏大。
iostat
vmstat 雖然萬能,但是它分析的東西有限,iostat 是專業分析 IO 性能的工具,可以友善檢視 CPU、網卡、tty 裝置、磁盤、CD-ROM 等等裝置的資訊,非常強大,總結下來,共有以下幾種用法:
1)iostat -c 檢視部分 CPU 使用情況:
這裡顯示的是多個 CPU 的平均值,每個字段的含義我就不多解釋了,我一般會重點關注 %iowait 和 %idle,分别表示 CPU 等待 IO 完成時間的百分比和 CPU 空閑時間百分比。
如果 %iowait 較高,則表明磁盤存在 IO 瓶頸,如果 %idle 較高,則 CPU 比較空閑,如果兩個值都比較高,則有可能 CPU 在等待配置設定記憶體,瓶頸在記憶體,此時應該加大記憶體,如果 %idle 較低,則此時瓶頸在 CPU,應該增加 CPU 資源。
2)iostat -d 檢視磁盤使用情況,主要是顯示 IOPS 和吞吐量資訊(-k : 以 KB 為機關顯示,-m:以 M 為機關顯示):
其中,幾個參數分别解釋如下:
- tps:裝置每秒的傳輸次數(transfers per second),也就是讀寫次數。
- kB_read/s:每秒讀磁盤的資料量
- kB_wrtn/s:每秒寫磁盤的資料量
- kB_read:讀取磁盤的資料總量
- kB_wrtn:寫入磁盤的資料總量
3)iostat -x 檢視磁盤詳細資訊:
其中,幾個參數解釋如下;
- rrqm/s 和 wrqm/s:分别每秒進行合并的讀操作數和寫操作數,這是什麼意思呢,合并就是說把多次 IO 請求合并成少量的幾次,這樣可以減小 IO 開銷,buffer 存在的意義就是為了解決這個問題的。
- r/s 和 w/s:每秒磁盤讀寫的次數。這兩個值相加就是 tps。
- rkB/s 和 wkB/s:每秒磁盤讀寫的資料量,這兩個值和上面的 kB_read/s、kB_wrnt/s 是一個意思。
- avgrq-sz:平均每次讀寫磁盤扇區的大小。
- avgqu-sze:平均 IO 隊列長度。隊列長度越短越好。
- await:平均每次磁盤讀寫的等待時間(ms)。
- svctm:平均每次磁盤讀寫的服務時間(ms)。
- %util:一秒鐘有百分之多少的時間用于磁盤讀寫操作。
以上這些參數太多了,我們并不需要每個都關注,可以重點關注兩個:
1)%util:衡量 IO 的繁忙程度
這個值越大,說明産生的 IO 請求較多,IO 壓力較大,我們可以結合 %idle 參數來看,如果 %idle < 70% 就說明 IO 比較繁忙了。也可以結合 vmstat 的 b 參數(等待 IO 的程序數)和 wa 參數(IO 等待所占 CPU 時間百分比)來看,如果 wa > 30% 也說明 IO 較為繁忙。
2)await:衡量 IO 的響應速度
通俗了解,await 就像我們去醫院看病排隊等待的時間,這個值和醫生的服務速度(svctm)和你前面排隊的人數(avgqu-size)有關。如果 svctm 和 await 接近,說明磁盤 IO 響應時間較快,排隊較少,如果 await 遠大于 svctm,說明此時隊列太長,響應較慢,這時可以考慮換性能更好的磁盤或更新 CPU。
4)iostat 1 2 預設顯示 cpu 和 吞吐量資訊,1 定時 1s 顯示,2 顯示 2 條資訊
程序 IO 性能分析
有了以上兩個指令,基本上能對磁盤 IO 的資訊有個全方位的了解了。但如果要确定具體哪個程序的 IO 開銷較大,這就得借助另外的工具了。
iotop
這個指令類似 top,可以顯示每個程序的 IO 情況,有了這個指令,就可以定位具體哪個程序的 IO 開銷比較大了。
OK,最後還是總結下,
fdisk -l
和
df
檢視磁盤基本資訊,
iostat -d
檢視磁盤 IOPS 和吞吐量,
iostat -x
結合 vmstat 檢視磁盤的繁忙程度和處理效率。
參考:
http://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/iostat.html http://rdc.hundsun.com/portal/article/731.html原文位址本文首發于公衆号 CloudDeveloper(ID: cloud_dev),專注于幹貨分享,号内有大量書籍和視訊資源,背景回複「1024」即可領取,歡迎大家關注,二維碼文末可以掃。
一文掌握 Linux 性能分析之 CPU 篇 一文掌握 Linux 性能分析之記憶體篇