如何檢查每個行程的磁碟 I/O 利用率?

如何檢查每個行程的磁碟 I/O 利用率?

我在使用 Linux 系統時遇到問題,我發現sysstatsar報告了磁碟 I/O 的巨大峰值、平均服務時間以及平均等待時間。

下次發生這些高峰時,我如何確定是哪個進程導致了這些峰值?

可以用 做嗎sar?我可以從已錄製的文件中找到此資訊嗎sar

sar -d系統停頓 的輸出發生在 12.58-13.01pm 左右。

12:40:01          DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
12:40:01       dev8-0     11.57      0.11    710.08     61.36      0.01      0.97      0.37      0.43
12:45:01       dev8-0     13.36      0.00    972.93     72.82      0.01      1.00      0.32      0.43
12:50:01       dev8-0     13.55      0.03    616.56     45.49      0.01      0.70      0.35      0.47
12:55:01       dev8-0     13.99      0.08    917.00     65.55      0.01      0.86      0.37      0.52
13:01:02       dev8-0      6.28      0.00    400.53     63.81      0.89    141.87    141.12     88.59
13:05:01       dev8-0     22.75      0.03    932.13     40.97      0.01      0.65      0.27      0.62
13:10:01       dev8-0     13.11      0.00    634.55     48.42      0.01      0.71      0.38      0.50

我對昨天開始的另一個線程也有這個後續問題:

答案1

如果您夠幸運,能夠趕上下一個高峰使用期,您可以使用互動式方式研究每個進程的 I/O 統計資料奧托普

答案2

您可以使用PID統計使用以下命令每 20 秒列印每個進程的累積 io 統計資料:

# pidstat -dl 20

每行都有以下列:

  • PID--進程號
  • kB_rd/s - 任務導致每秒從磁碟讀取的千位元組數。
  • kB_wr/s - 任務每秒已導致或應導致寫入磁碟的千位元組數。
  • kB_ccwr/s - 任務已取消寫入磁碟的千位元組數。當任務截斷一些髒頁快取時,可能會發生這種情況。在這種情況下,其他任務已佔的某些 IO 將不會發生。
  • 命令 - 任務的命令名稱。

輸出看起來像這樣:

05:57:12 PM       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
05:57:32 PM       202      0.00      2.40      0.00  jbd2/sda1-8
05:57:32 PM      3000      0.00      0.20      0.00  kdeinit4: plasma-desktop [kdeinit]              

05:57:32 PM       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
05:57:52 PM       202      0.00      0.80      0.00  jbd2/sda1-8
05:57:52 PM       411      0.00      1.20      0.00  jbd2/sda3-8
05:57:52 PM      2791      0.00     37.80      1.00  kdeinit4: kdeinit4 Running...                   
05:57:52 PM      5156      0.00      0.80      0.00  /usr/lib64/chromium/chromium --password-store=kwallet --enable-threaded-compositing 
05:57:52 PM      8651     98.20      0.00      0.00  bash 

05:57:52 PM       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
05:58:12 PM       202      0.00      0.20      0.00  jbd2/sda1-8
05:58:12 PM      3000      0.00      0.80      0.00  kdeinit4: plasma-desktop [kdeinit]              

答案3

沒有什麼比持續監控更好的了,您根本無法在事件發生後取回時間敏感的資料...

有幾件事你可能然而,能夠檢查、牽連或消除——/proc是你的朋友。

sort -n -k 10 /proc/diskstats
sort -n -k 11 /proc/diskstats

字段10、11是累計寫入扇區和累計寫入時間(ms)。這將顯示您的熱檔案系統分割區。

cut -d" " -f 1,2,42 /proc/[0-9]*/stat | sort -n -k +3

這些欄位是 PID、命令和累積 IO 等待週期。這將顯示您的熱過程,儘管只是如果他們還在跑步。 (您可能想忽略檔案系統日誌線程。)

上述內容的效用取決於正常運作時間、長時間運行的進程的性質以及檔案系統的使用方式。

注意事項:不適用於 2.6 之前的內核,如果不確定,請檢查您的文件。

(現在去幫未來的自己一個忙,安裝 Munin/Nagios/Cacti/無論什麼;-)

答案4

使用btrace。例如,它很容易使用btrace /dev/sda。如果該命令不可用,則可能在套件中可用區塊追蹤

編輯:由於核心中未啟用 debugfs,您可以嘗試date >>/tmp/wtf && ps -eo "cmd,pid,min_flt,maj_flt" >>/tmp/wtf或類似的操作。記錄頁面錯誤當然與使用 btrace 完全不同,但如果幸運的話,它可能會給您一些有關最消耗磁碟的進程的提示。我剛剛嘗試了 I/O 最密集的伺服器之一,並列出了我知道消耗大量 I/O 的進程。

相關內容