Linuxでは、どのプロセスが私のディスクI / O帯域幅を使用しているかを知りたいです。
使用できることはわかりますが、さまざまな理由でインストールできないiotop
マシンがあります。iotop
この情報を手動で取得するにはどうすればよいですか? (それiotop
自体はどのように機能しますか?)
答え1
のファイルは/proc/<pid>/io
必要なものを示します。同様の出力を得るには、少しのスクリプト操作が必要ですiotop
。よりLinuxカーネルドキュメント/proc/<pid>/io
ファイル値で:
文字タイプ
I/O カウンター: 読み取り文字 この操作によってリポジトリーから読み取られたバイト数。これは、単にプロセスがread()とpread()に渡したバイトの合計です。 tty IOのようなものが含まれており、物理的な物理ディスクIOが必要かどうかに影響されません(ページキャッシュで読み取りがすでに満たされている可能性があります)。
文字タイプ
I / Oカウンター:書き込み文字この操作のためにディスクに書き込まれたか書き込まれなければならなかったバイト数。 rcharに似た警告がここに適用されます。
[...]
読み取ったバイト数
I / Oカウンタ:バイト読み取りは、このプロセスが実際にストレージ階層から取得したバイト数を計算しようとします。これは commit_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つのリストの間に2秒の遅延を持つ2つのリストを作成し($delay
:は含まれるか縮小することができます)、リストを比較して差を計算します。過去2秒間、I / Oは最大10のプロセスとその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)