バッファキャッシュヒットを含むカーネルからブロックデバイスIO全体を取得します。

バッファキャッシュヒットを含むカーネルからブロックデバイスIO全体を取得します。

私はLinuxでシステム統計を表示するツールを作成しています。どのように動作するかを理解するために/sysと/proc APIを使用しました。

現在、私は/sys/block/<dev>/statブロックデバイス統計を取得するために読んでいます(文書)。これは、ディスク上でどのくらいの読み書きが行われているかを判断するのに役立ちますが、アプリケーションの観点から、ブロックデバイスのI / O全体を確認することができるかどうか疑問に思います。

私が意味するものを示す例は次のとおりです。

> cat somebigfile > /dev/zero # Takes some time, triggers device I/O
> cat somebigfile > /dev/zero # Runs quickly a second time, no device I/O

2つの実行の違いは、カーネルが2番目の読み取りのためにディスクの代わりにバッファキャッシュに移動するためだと思います。キャッシュをフラッシュして、/proc/sys/vm/drop_caches最初のようにコマンドを再実行してこれを確認しました。

一定期間にブロックデバイスから読み取られた合計バイト数(バッファキャッシュから提供されるバイトを含む)を確認する最も簡単な方法は何ですか?

の値を合計することも検討しましたが/proc/<pid>/io、これにはすべてのI / Oが含まれ、デバイスやタイプ別に分割されません。

私は次のことを使ってこれを行うことができることを知っています。システムクリックしかし、もっと簡単な方法があるかどうか疑問に思います。

答え1

数年前、私は「統計コレクター」サービスを作成しました。ディスク状態の読み書き

値を使用し/sys/block/<dev>/statてバイトに変換しました。

アプリケーションの観点からは、cgroupとても便利です。さまざまなアプリケーションをグループに配置できます。ブキオ'と' blkio.io_service_bytes'カウンタを読みます。

関連情報