実行中のプロセスのディスク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();
    

答え2

ブロックデバイスへの「読み取り」または「書き込み」呼び出しの数にのみ興味がある場合これは、以下を決定するためのRed HatのSOPです。

ブロックダンプ機能と一部のスクリプトを使用すると、生成されるI / O操作の高レベルの概要を収集できます。これを行うには、次の操作を行います。

短時間でシステムログを無効にします(データのキャプチャを妨げないように)。

#サービスsyslogを停止#echo 1> /proc/sys/vm/block_dump

高いiowait問題が発生するのを待ってから、syslog(またはrsyslogを使用している場合)を再度有効にしてブロックダンプを無効にします。

#サービスシステムログの起動#echo 0> /proc/sys/vm/block_dump

次のコマンドを使用してdmesg出力を解析し、特定のプロセスで実行された読み取り/書き込み/ダーティタスクを見つけます。

#dmesg | awk '/(READ|WRITE|dirtied)/ {activity[$1]++} END {for (x in Activity) print x, Activity[x]}'|sort-nr -k 2,2|head -n 10

kjournald(1425): 5984 kjournald(3681): 1269 pdflush(27301): 725 iostat(2913): 134 crond(26919): 61 crond(28985): 60 crod(85 ):50 ノーチラス(24498):46

上記の出力例は、ブロックダンプ実行中にREAD、WRITE、およびダーティジョブを実行した上位10のプロセスを示しています。このデータを使用して、ジョブを実行するプロセスの数の高レベルの概要を収集し、単一のプロセスがiowaitに大きく貢献していることを確認するのに役立ちます。

各プロセスにiowait統計を提供し、スクリプトの一部として実行できるatopやiotopなどのコマンドラインツールもあります(特定のPIDで単一の反復を実行するバッチモードがあることを意味します)。


編集する: もう少し研究してみればそうできると思う。/proc/$pid/stat から各プロセスの iowait を取得します。(「集約ブロックI/O待ち時間」検索)

関連情報