回答:
のファイルは、/proc/<pid>/io
必要なものを表します。に似た出力を取得するのは少しスクリプト作業iotop
です。ファイル値については、Linuxカーネルのドキュメントを参照してください/proc/<pid>/io
。
rchar
I / Oカウンター:読み取り文字数このタスクがストレージから読み取る原因となったバイト数。これは単に、このプロセスがread()およびpread()に渡したバイトの合計です。tty IOなどが含まれ、実際の物理ディスクIOが必要かどうかには影響されません(読み取りはページキャッシュから満たされた可能性があります)
wchar
I / Oカウンター:書き込まれた文字このタスクによってディスクに書き込まれた、または書き込まれる原因となるバイト数。ここでも、rcharと同様の注意事項が適用されます。
[...]
read_bytes
I / Oカウンター:読み取られたバイト数このプロセスが実際にストレージレイヤーからフェッチしたバイト数をカウントしようとしました。submit_bio()レベルで実行されるため、ブロックバックされたファイルシステムに対して正確です。
write_bytes
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秒の遅延で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)