
我在使用 Linux 系統時遇到問題,我發現sysstat
並sar
報告了磁碟 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 的進程。