Linux
知道哪個程序在沒有 iotop 的情況下進行 I/O
在 Linux 上,我想知道哪個程序使用了我的磁碟 I/O 頻寬。
我知道我可以使用
iotop
,但我有一台機器,由於各種原因,iotop
無法安裝。如何手動獲取該資訊?(它
iotop
本身是如何進行的?)
中的文件
/proc/<pid>/io
代表您需要的內容。獲得類似於iotop
. 請參閱linux 核心文件中的/proc/<pid>/io
文件值:rchar
I/O 計數器:chars read 此任務已導致從儲存中讀取的字節數。這只是該程序傳遞給 read() 和 pread() 的字節總和。它包括諸如 tty IO 之類的東西,並且不受是否需要實際的物理磁碟 IO 的影響(可能已經從頁面記憶體中滿足了讀取)
wchar
I/O 計數器:寫入的字元 此任務已導致或將導致寫入磁碟的字節數。與 rchar 類似的警告在這裡適用。
$$ … $$ 讀取字節
I/O 計數器:讀取的字節數 嘗試計算該程序確實導致從儲存層獲取的字節數。在 submit_bio() 級別完成,因此對於塊支持的文件系統是準確的。
寫字節
I/O 計數器:寫入的字節數 嘗試計算此程序導致發送到儲存層的字節數。這是在頁面弄髒時完成的。
現在,您可以使用那個小
bash
腳本:#!/bin/bash if [ "$(id -u)" -ne 0 ] ; then echo "Must be root" 2>&1 exit 1 fi delay=2 lista=$(for p in $(pgrep "."); do echo -n "$p "; grep ^rchar /proc/$p/io 2>/dev/null; done) while :; do echo "-----" listb=$(for p in $(pgrep "."); do echo -n "$p "; grep ^rchar /proc/$p/io 2>/dev/null; done) echo "$lista" | while read -r pida xa bytesa; do [ -e "/proc/$pida" ] || continue echo -en "$pida:\t" bytesb=$(echo "$listb" | awk -v pid=$pida '$1==pid{print $3}') echo "$((($bytesb - $bytesa) / $delay)) b/s" done | sort -nk2 | tail sleep $delay listb=$lista done
它創建兩個列表,它們之間有 2 秒的延遲(
$delay
: 可以在或減少),然後比較列表併計算差異。具有最多 I/O 的 10 個程序在最後 2 秒內使用其 I/O 頻寬列印。如果您想寫入 I/O 而不是讀取 I/O,只需grep
將列表中的命令編輯wchar
為rchar
:lista=$(for p in $(pgrep "."); do echo -n "$p "; grep ^wchar /proc/$p/io 2>/dev/null; done) listb=$(for p in $(pgrep "."); do echo -n "$p "; grep ^wchar /proc/$p/io 2>/dev/null; done)