Linux檢視硬碟讀寫情況(彙總版)

2020-07-16 10:05:12
除了 CPU 和記憶體,硬碟讀寫(I/O)能力也是影響 Linux 系統效能的重要因素之一。本節將介紹幾個可用來檢視硬碟讀寫效能的系統命令,並教大家如何通過這些命令的輸出結果,判斷出當前系統中硬碟是否處於超負荷運轉。

Linux檢視硬碟讀寫效能:sar -d命令

《Linux sar命令》一節,已經對 sar 命令的基本用法做了詳細的介紹,這裡不再贅述,接下來主要講解如何通過 sar -d 命令分析出硬碟讀寫的效能。

下面是執行 sar -d 命令的輸出結果樣例:
[[email protected] ~]# sar -d 3 5
Linux 2.6.32-431.el6.x86_64 (localhost)     10/25/2019     _x86_64_    (1 CPU)

06:36:52 AM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
06:36:55 AM    dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

06:36:55 AM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
06:36:58 AM    dev8-0      1.00      0.00     12.00     12.00      0.00      0.00      0.00      0.00

06:36:58 AM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
06:37:01 AM    dev8-0      1.99      0.00     47.76     24.00      0.00      0.50      0.25      0.05

Average:          DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
Average:       dev8-0      1.00      0.00     19.97     20.00      0.00      0.33      0.17      0.02
結合以上輸出結果,可以遵循如下標準來判斷當前硬碟的讀寫(I/O)效能:
  • 通常情況下 svctm 的大小和硬碟效能有關,其值小於 await。但需要注意的是,CPU、記憶體的負荷也會對 svctm 的值造成影響,過多的請求也會間接導致 svctm 值的增加。
  • await 值通常會受到 svctm、I/O 佇列長度以及 I/O 請求模式的影響,如果 svctm 的值和 await 很接近,則表示幾乎沒有 I/O 等待,當前硬碟的效能很好;如果 await 的值遠高於 svctm,則表示 I/O 佇列等待太長,系統上執行的應用程式將變慢,此時可以通過更換更快的硬碟來解決問題。
  • %util 項也是衡量硬碟 I/O 效能的重要指標,即如果其值接近 100%,就表示硬碟產生的 I/O 請求太多,I/O 系統正在滿負荷工作,長期這樣會影響系統的效能。必要時,可以優化程式或者更換更大、更快的硬碟來解決這個問題。

Linux檢視硬碟讀寫效能:iostat -d命令

通過執行 iostat -d 命令,也可以檢視系統中硬碟的使用情況,如下是執行此命令的一個樣例輸出:
[[email protected] ~]# iostat -d 2 3
Linux 2.6.32-431.el6.x86_64 (localhost)  10/30/2019  _x86_64_ (8 CPU)

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               5.29       337.11         9.51     485202      13690

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               1.00         8.00        16.00         16         32

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               0.00         0.00         0.00          0          0
此輸出結果中,我們重點看後面 4 列,它們各自表示的含義分別是:
  • Blk_read/s:表示每秒讀取的資料塊數;
  • Blk_wrtn/s:表示每秒寫入的資料塊數;
  • Blk_read:表示讀取的所有塊數;
  • Blk_wrtn:表示寫入的所有塊數。

注意,此輸出結果中,第一次輸出的資料是系統從啟動以來直到統計時的所有傳輸資訊,從第二次輸出的資料開始,才代表在指定檢測時間段內系統的傳輸值。

根據 iostat 命令的輸出結果,我們也可以從中判斷出當前硬碟的 I/O 效能。比如說,如果 Blk_read/s 的值很大,就表示當前硬碟的讀操作很頻繁;同樣,如果 Blk_wrtn/s 的值很大,就表示當前硬碟的寫操作很頻繁。對於 Blk_read 和 Blk_wrtn 的大小,沒有一個固定的界限,不同的系統應用對應值的範圍也不同。但如果長期出現超大的資料讀寫情況,通常是不正常的,一定程度上會影響系統效能。

不僅如此,iostat 命令還提供了統計指定硬碟 I/O 狀況的方法,即使用 -x 選項。例如:
[[email protected] ~]# iostat -x /dev/sda 2 3
Linux 2.6.32-431.el6.x86_64 (localhost)  10/30/2019  _x86_64_ (8 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.09    0.00    0.24    0.26    0.00   99.42

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               2.00     0.56    2.92    0.44   206.03     7.98    63.56     0.03    9.99   5.31   1.79

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.31    0.00    0.06    0.00    0.00   99.62

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

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.50    0.00    0.06    0.00    0.00   99.44

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
此輸出結果基本和 sar -d 命令的輸出結果相同,需要額外說明的幾個選項的含義如下:
  • rrqm/s:表示每秒被合併的讀運算元目(檔案系統會對讀取同一 block 塊的請求進行合併)
  • wrqm/s:表示每秒被合併的寫運算元目;
  • r/s:表示每秒完成讀 I/O 裝置的次數;
  • w/s:表示每秒完成寫 I/O 裝置的次數;
  • rsec/s:表示每秒讀取的磁區數;
  • wsec/s:表示每秒寫入的磁區數;

Linux檢視硬碟讀寫效能:vmstat -d命令

使用 vmstat 命令也可以檢視有關硬碟的統計資料,例如:
[[email protected] ~]# vmstat -d 3 2
disk- ------------reads------------ ------------writes----------- -----IO------
       total merged sectors      ms  total merged sectors      ms    cur    sec
sda     6897   4720  485618   71458   1256   1475   21842    9838      0     43
disk- ------------reads------------ ------------writes----------- -----IO------
       total merged sectors      ms  total merged sectors      ms    cur    sec
sda     6897   4720  485618   71458   1256   1475   21842    9838      0     43
該命令的輸出結果顯示了硬碟的讀(reads)、寫(writes)以及 I/O 的使用狀態。

以上主要講解了如何通過命令檢視當前系統中硬碟 I/O 的效能,其實影響硬碟 I/O 的因素是多方面的,例如應用程式本身、硬體設計、系統自身設定等等。

要想解決硬碟 I/O 的瓶頸,關鍵是要提高 I/O 子系統的執行效率。比如說,首先從應用程式上對硬碟讀寫效能進行優化,能夠放到記憶體中執行的操作儘量別儲存到硬碟裡(記憶體讀寫效率要遠高於硬碟讀寫效率);其次,還可以對硬碟儲存方法進行合理規劃,選擇合適的 RAID 儲存方式;最後,選擇適合自身應用的檔案系統,必要時可以使用裸裝置提高硬碟的讀寫效能。

在裸裝置上,資料可以直接讀寫,不必經過作業系統級別的快取,還可以避免檔案系統級別的維護開銷(檔案系統需要維護超級塊、I-node 塊等)以及作業系統的 cache 預讀功能(減少了 I/O 請求)。