iotop
の出力を理解できません:1.5MB /秒のディスク書き込み(右上)が表示されますが、すべてのプログラムには0.00 B /秒があります。どうして?
ビデオは、Kubuntu 14.04.3 LTS x64で数百万のファイルが含まれているフォルダーのコンテンツを削除しているときに撮影されました singPerl -e 'for(<*>){((stat)[9]<(unlink))}'
。
iotop
はSudo iotop
を使用して起動されました。
Iotopによって表示される情報は、個々のプロセスやシステム全体については同じ方法で収集されません。 「実際の」グローバルな数値は、プロセスごとの数値の合計ではありません(それが「合計」です)。
すべての情報は proc filesystem から収集されます。
/proc/PID/io
、具体的にはrchar
とwchar
の値からデータを読み取ります。これらは、read
およびwrite
システムコール(readv
、writev
、recv
、send
などのバリアントを含む)で渡されるバイト数です。/proc/vmstat
、特にpgpgin
とpgpgout
の値から読み取られます。これらは、カーネルとハードウェアの間で交換されるデータを測定します(より正確には、これはカーネルのブロックデバイスレイヤーによってシャッフルされたデータです)。プロセスごとのデータとブロックデバイスレイヤーのデータが異なる理由はたくさんあります。特に:
最後の違いは、ここで何が表示されているかを説明しています。ファイルの削除はメタデータにのみ影響し、データには影響しないため、プロセスは何も書き込みません。削除するファイルをリストするためにディレクトリの内容を読み取っている可能性がありますが、それは気付かれずにスクロールできるほど小さいです。
Linuxがファイルメタデータの更新を監視する方法を提供しているとは思いません。一部のファイルシステムでは、/sys/fs
の下のエントリを介してファイルシステムごとのI/Oを監視できます。特定のプロセスに対してメタデータI/Oを説明できないと思います。複数のプロセスが同じメタデータの読み取りまたは変更を引き起こしている可能性があるため、一般的なケースでは非常に複雑になります。