実行中のプロセスのディスクIOレイテンシ測定

実行中のプロセスのディスクIOレイテンシ測定

ヒストグラムを作成するために実行中のプロセスのディスクIO待ち時間を測定しようとしています。

DTraceを提供するオペレーティングシステムでは、DTraceを使用してこれを行うことができます(例:このジョイアント論文)、しかし私のアプリケーションはLinux上で動作します。私の最初の考えは試みることでperfカウンターを得ることができましたが、時間デルタを取得する方法を見つけることができませんでした。strace(たとえば)を使用して時間デルタを取得できますが、strace -e read -TトレースをディスクIOに制限できるかどうかはわかりません(システムには多量のネットワークインターフェイスもあります)。

Linuxでこれを行う方法はありますか?

ベストアンサー1

これは実際には非常に複雑です。しかし、ヒントがあります:

  • DTraceのLinuxエミュレーションであるSystemTapについて学びます。同様の作業のためのサンプルスクリプトがあるかもしれません。

  • 勉強するブロック追跡。理論的には、出力を解析できます。これはデバイス遅延時間(サービス時間)よりも長くなります。応答時間ショーが始まりましたread()

straceすべて(フィルタを使用してもすべてのシステムコール-e)を追跡し、サーバーをロードしてプロセス速度を大幅に低下させるため、おそらく不適切です。Perf非常にあいまいなツールなので、時には出力を理解すると思うかもしれませんが、実際にはそうではなく、機能セットはカーネルバージョンによって大きく異なります。基本的には現在のperf測定に適しています。CPU時間(期間)および[ただし]測定には適していません。応答時間(実際に必要なもの)。この問題を軽減するために何かを実装したいと聞きましたが、最近開発されたカーネルに何かがあるかもしれません。 (perf script -lさらに調査したい場合は、パフォーマンススクリプト()を調べることもできます。)

  • たぶんあなたはそれから何かを得ることができます。この記事を読んでくださいhttp://lwn.net/Articles/370423/(これは紹介する.) ご覧のとおり、pid機能によって ftracing を制限し、次のようなものを使用できますsys_read

    # mount -t debugfs debugfs /sys/kernel/debug # if it's not already mounted
    # cd /sys/kernel/debug/tracing
    # echo $$ > set_ftrace_pid  # pid of process to trace
    # echo sys_read sys_write > set_ftrace_filter
    # echo function_graph > current_tracer
    # head trace
    
    # tracer: function_graph
    #
    # CPU  DURATION                  FUNCTION CALLS
    # |     |   |                     |   |   |   |
     0)   8.235 us    |  sys_write();
     0)   3.393 us    |  sys_write();
     0) ! 459859.3 us |  sys_read();
     0)   6.289 us    |  sys_write();
     0)   8.773 us    |  sys_write();
     0) ! 1576469 us |  sys_read();
    

おすすめ記事