web-dev-qa-db-ja.com

iotopは1.5 MB /秒のディスク書き込みを示していますが、すべてのプログラムは0.00 B /秒です。

iotopの出力を理解できません:1.5MB /秒のディスク書き込み(右上)が表示されますが、すべてのプログラムには0.00 B /秒があります。どうして?

enter image description here

ビデオは、Kubuntu 14.04.3 LTS x64で数百万のファイルが含まれているフォルダーのコンテンツを削除しているときに撮影されました singPerl -e 'for(<*>){((stat)[9]<(unlink))}'

iotopSudo iotopを使用して起動されました。

21

Iotopによって表示される情報は、個々のプロセスやシステム全体については同じ方法で収集されません。 「実際の」グローバルな数値は、プロセスごとの数値の合計ではありません(それが「合計」です)。

すべての情報は proc filesystem から収集されます。

  • プロセスごとに、iotopは/proc/PID/io、具体的にはrcharwcharの値からデータを読み取ります。これらは、readおよびwriteシステムコール(readvwritevrecvsendなどのバリアントを含む)で渡されるバイト数です。
  • グローバルな「実際の」値は/proc/vmstat、特にpgpginpgpgoutの値から読み取られます。これらは、カーネルとハードウェアの間で交換されるデータを測定します(より正確には、これはカーネルのブロックデバイスレイヤーによってシャッフルされたデータです)。

プロセスごとのデータとブロックデバイスレイヤーのデータが異なる理由はたくさんあります。特に:

  • キャッシングとバッファリングは、1つの層で発生しているI/Oが他の層で同時に、または同じ回数だけ発生していない可能性があることを意味します。たとえば、キャッシュから読み取られたデータは、それにアクセスするプロセスからの読み取りと見なされますが、ハードウェアからの対応する読み取りはありません(すでに別のプロセスのために、以前に発生した可能性があります)。
  • プロセスレベルのデータには、パイプ、ソケット、および基盤となるディスクやその他のブロックデバイスを含まないその他の入出力で交換されるデータが含まれます。
  • プロセスレベルのデータは、メタデータではなく、ファイルの内容のみを考慮します。

最後の違いは、ここで何が表示されているかを説明しています。ファイルの削除はメタデータにのみ影響し、データには影響しないため、プロセスは何も書き込みません。削除するファイルをリストするためにディレクトリの内容を読み取っている可能性がありますが、それは気付かれずにスクロールできるほど小さいです。

Linuxがファイルメタデータの更新を監視する方法を提供しているとは思いません。一部のファイルシステムでは、/sys/fsの下のエントリを介してファイルシステムごとのI/Oを監視できます。特定のプロセスに対してメタデータI/Oを説明できないと思います。複数のプロセスが同じメタデータの読み取りまたは変更を引き起こしている可能性があるため、一般的なケースでは非常に複雑になります。