1. 程式人生 > >【原創】一文掌握 Linux 性能分析之 I/O 篇

【原創】一文掌握 Linux 性能分析之 I/O 篇

二維 服務器 萬能 應該 edi 瓶頸 公眾號 docs 磁盤容量

本文首發於我的公眾號 CloudDeveloper(ID: cloud_dev),專註於幹貨分享,號內有大量書籍和視頻資源,後臺回復「1024」即可領取,歡迎大家關註,二維碼文末可以掃。

一文掌握 Linux 性能分析之 CPU 篇

一文掌握 Linux 性能分析之內存篇

這是 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 -ldf 查看磁盤基本信息,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++編程技術等內容,歡迎大家關註。

技術分享圖片

【原創】一文掌握 Linux 性能分析之 I/O 篇