解決策 1:
幸運にも次のピーク使用期間を捉えることができれば、iotop を使用してプロセスごとの I/O 統計をインタラクティブに調べることができます。
解決策 2:
pidstat を使用できます このコマンドで 20 秒ごとにプロセスごとの累積 io 統計を出力するには:
# 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 は累積書き込みセクタと累積時間 (ms) 書き込みです。これにより、ホット ファイル システム パーティションが表示されます。
cut -d" " -f 1,2,42 /proc/[0-9]*/stat | sort -n -k +3
これらのフィールドは、PID、コマンド、および累積 IO 待機ティックです。これにより、ホット プロセスが表示されますが、まだ実行中の場合のみ . (おそらく、ファイルシステムのジャーナリング スレッドを無視することをお勧めします。)
上記の有用性は、稼働時間、長時間実行されるプロセスの性質、およびファイル システムの使用方法によって異なります。
警告:2.6 より前のカーネルには適用されません。不明な場合はドキュメントを確認してください。
(さあ、未来の自分のために、Munin/Nagios/Cacti などをインストールしてください;-)
解決策 4:
atop
を使用 . (http://www.atoptool.nl/)
atop
の圧縮ファイルにデータを書き込みます インタラクティブなスタイルで後で読むことができます。 10 秒ごとに読み取り値 (デルタ) を取得します。 1080 回実行します (3 時間。したがって、忘れても、出力ファイルでディスクが不足することはありません):
$ atop -a -w historical_everything.atop 10 1080 &
悪いことが再び起こった後:
(まだバックグラウンドで実行されている場合でも、10 秒ごとに追加されます)
% atop -r historical_everything.atop
あなたが IO と言ったので、私は 3 つのキーを押します:tdD
t - move forward to the next data gathering (10 seconds)
d - show the disk io oriented information per process
D - sort the processes based on disk activity
T - go backwards 1 data point (10 seconds probably)
h - bring up help
b - jump to a time (nearest prior datapoint) - e.g. b12:00 - only jumps forward
1 - display per second instead of delta since last datapiont in the upper half of the display
解決策 5:
btrace
を使用 . btrace /dev/sda
のように簡単に使用できます。 .コマンドが利用できない場合は、パッケージ blktrace で利用できる可能性があります .
編集 :カーネルで debugfs が有効になっていないため、date >>/tmp/wtf && ps -eo "cmd,pid,min_flt,maj_flt" >>/tmp/wtf
を試してください。 または類似。もちろん、ページ フォールトのログ記録は、btrace を使用する場合とまったく同じではありませんが、運が良ければ、ディスクを最も消費するプロセスに関するヒントが得られる場合があります。最も I/O 集約型のサーバーの 1 つを試してみたところ、多くの I/O を消費していることがわかっているプロセスがリストに含まれていました。