ディスク書き込みをさらに調査して、どのプロセスがSSDに書き込みを行うかを調べます


11

新しいSSDシステムドライブへのディスク書き込みを最小限にしようとしています。私はiostatの出力にこだわっています:

~ > iostat -d 10 /dev/sdb
Linux 2.6.32-44-generic (Pluto)     13.11.2012  _i686_  (2 CPU)

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdb               8,60       212,67       119,45   21010156   11800488

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdb               3,00         0,00        40,00          0        400

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdb               1,70         0,00        18,40          0        184

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdb               1,20         0,00        28,80          0        288

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdb               2,20         0,00        32,80          0        328

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdb               1,20         0,00        23,20          0        232

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdb               3,40        19,20        42,40        192        424

ご覧のとおり、sdbへの書き込みがあります。どのプロセスの書き込みを解決するにはどうすればよいですか?

iotopについては知っていますが、どのファイルシステムがアクセスされているかは表示されません。

回答:


7

以下では、カーネルの仮想メモリブロックダンプメカニズムを使用します。最初にperlスクリプトを取得します。

wget https://raw.githubusercontent.com/true/aspersa-mirror/master/iodump

次に、ブロックダンプをオンにします。

echo 1 | sudo tee /proc/sys/vm/block_dump

そして、次を実行します:

while true; do sleep 1; sudo dmesg -c; done  | perl iodump

を押しControlcて終了すると、次のようなものが表示されます。

^C# Caught SIGINT.
TASK                   PID      TOTAL       READ      WRITE      DIRTY DEVICES
jbd2/sda3-8            620         40          0         40          0 sda3
jbd2/sda1-8            323         21          0         21          0 sda1
#1                    4746         11          0         11          0 sda3
flush-8:0             2759          7          0          7          0 sda1, sda3
command-not-fou       9703          4          4          0          0 sda1
mpegaudioparse8       8167          2          2          0          0 sda3
bash                  9704          1          1          0          0 sda1
bash                  9489          1          0          1          0 sda3
mount.ecryptfs_       9698          1          1          0          0 sda1

完了したらブロックダンプをオフにします。

echo 0 | sudo tee /proc/sys/vm/block_dump

この役立つ情報については、http: //www.xaprb.com/blog/2009/08/23/how-to-find-per-process-io-statistics-on-linux/に感謝します


10

少なくともiotopから始めることができます。どのファイルシステムが書き込まれているのかはわかりませんが、調査するプロセスがいくつかあります。

sudo apt-get install iotop
sudo iotop

瞬時のディスクの読み取りと書き込み、およびコマンドの読み取りまたは書き込みの名前が表示されます。

書き込み頻度の低いプロセスをキャッチしようとしている場合は、--accumulateオプションを使用するか、出力をファイルに記録できます。

sudo -i
iotop --batch > iotop_log_file

明らかにログファイルの書き込みが結果に表示されますが、ディスクに書き込む他のプロセスをgrepすることもできるはずです。

この時点までに、疑わしいプロセスの候補を見つけることができるはずです。iotopの左の列はpidを示しています。次に、プロセスが書き込み先のファイル記述子を見つけます。

sudo -i
strace -p <pid> 2>&1 | grep write

プロセスが書き込むと、次のような出力が表示されます。

write(1, "\n", 1)                       = 1
write(4, "test\n", 5)                   = 5
write(1, ">>> ", 4)                     = 4

書き込む最初の引数はファイル記述子です。0、1、2は単なるstdin、stdout、stderrであるため、おそらく2より大きい値を探しています。ファイル記述子4は面白そうです。

これで、ファイル記述子が指すファイルを見つけることができます。

lsof -p <pid>

次のような出力が得られます:

...
python  23908  rob  mem    REG    8,1    26258 8392656 /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
python  23908  rob    0u   CHR  136,5      0t0       8 /dev/pts/5
python  23908  rob    1u   CHR  136,5      0t0       8 /dev/pts/5
python  23908  rob    2u   CHR  136,5      0t0       8 /dev/pts/5
python  23908  rob    3w   REG   0,25      909 9049082 /home/rob/testfile
python  23908  rob    4w   REG   0,25       20 9049087 /home/rob/another_test_file

4列目を見てください。4wは、ファイル記述子4が書き込み用に開いており、ファイルがであることを意味しますanother_test_file

プロセスがファイルを開いたり、書き込んだり、閉じたりすることが可能です。その場合、lsofはそれを表示しません。これを次のようにキャッチできます。

strace -p <pid> 2>&1 | grep open

--accumulteについて知りませんでした。これは本当にクールな機能です。ありがとうございます!!! iotop --batch出力リダイレクトはUnicodeEncodeErrorで失敗します: 'ascii'コーデックは位置92-99の文字をエンコードできません:ファイル "/usr/lib/pymodules/python2.6/iotop/uiの範囲(128)にない序数。 py "、行405、refresh_display
zuba

私の回答が少なくともある程度役立っていて良かったです。リダイレクトは私のために機能します。説明できるかどうかわかりません。
ロブフィッシャー

OK、ちょっと遊んでみたところ、lsofとstraceを使用して、少なくともSSDに書き込むプロセスをキャッチするのに十分な検出作業を行うことができることがわかりました。Colin Ian Kingの答えが簡単に見えるように見えますが、これが質問通りに最終的に答えることを願っています!
ロブフィッシャー

1
応答が遅くなって申し訳ありませんが、straceで遊ぶまでは何も言えません。別の賢いアプローチをありがとう、私は賛成票を投じた。シェルスクリプトの記述経験が少ないため、スクリプトを記述して実装するのは非常に難しいと感じました。それが私が別のソリューションを選んだ理由です。知識を共有していただきありがとうございます!
ズバ

である必要がありますが--accumulated、スタック交換には投稿の編集を受け入れるために6文字が必要です。
h__
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.