一文掌握 Linux 效能分析之 I/O 篇
本文首發於我的公眾號 CloudDeveloper(ID: cloud_dev) ,專注於乾貨分享,號內有大量書籍和視訊資源,後臺回覆 「1024」 即可領取,歡迎大家關注,二維碼文末可以掃。
這是 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」 即可領取,分享的內容包括但不限於雲端計算虛擬化、容器、OpenStack、K8S、霧計算、網路、工具、SDN、OVS、DPDK、Linux、Go、Python、C/C++程式設計技術等內容,歡迎大家關注。