ヒストグラムを作成するために実行中のプロセスのディスク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();