
ヒストグラムを作成するために実行中のプロセスのディスク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待ち時間」検索)