iotopなしでI / Oを実行するプロセスを知る


12

Linuxでは、どのプロセスがディスクI / O帯域幅を使用しているかを知りたいです。

使用できることは知っていますiotopが、さまざまな理由でiotopインストールできないマシンがあります。

その情報を手動で取得するにはどうすればよいですか?(iotopそれ自体はどのように進みますか?)

回答:


16

のファイルは、/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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.