プロセスごとのディスク I/O 使用率を確認するにはどうすればよいですか?

プロセスごとのディスク I/O 使用率を確認するにはどうすればよいですか?

Linux システムに問題があり、ディスク I/O、平均サービス時間、平均待機時間の大きなピークを発見しsysstat、報告したいと考えています。sar

次回これらのピークが発生したときに、どのプロセスが原因であるかをどのように判断すればよいでしょうか?

で実行することは可能ですかsar? すでに記録されているファイルからこの情報を見つけることはできますかsar?

の出力sar -d、システム停止は午後 12 時 58 分から 13 時 01 分頃に発生しました。

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統計を対話的に調べることができます。iotop

答え2

使用できますピッドスタット次のコマンドを使用して、プロセスごとの累積 IO 統計を 20 秒ごとに出力します。

# pidstat -dl 20

各行には次の列が含まれます。

  • PID - プロセスID
  • kB_rd/s - タスクによってディスクから 1 秒あたりに読み取られたキロバイト数。
  • kB_wr/s - タスクによってディスクに書き込まれた、または 1 秒あたりに書き込まれるキロバイト数。
  • 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 は、累積された書き込みセクターと累積書き込み時間 (ミリ秒) です。これにより、ホット ファイル システム パーティションが表示されます。

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 を消費していることがわかっているプロセスがリストに含まれました。

関連情報