ヒストグラムを作成するために、実行中のプロセスのディスクIOレイテンシを測定しようとしています。
これを提供するオペレーティングシステムでDTraceを使用してこれを行うことはできますが(例: このJoyentの論文 のように)、私のアプリケーションはLinuxで実行されています。私の最初の考えはperf
を試すことでした、そして私はカウンターを得ることができます、しかし私は時間デルタを得る方法を見つけることができません。 strace
で時間デルタを取得できます(例:strace -e read -T
)、しかし、トレースをディスクに制限できるかどうかはわかりませんIO(このシステムにはビジーなネットワークインターフェイスもあります)。
Linuxでこれを行う方法はありますか?
これは実際には複雑です。しかし、ヒントがあります:
SystemTapについて学んでください。これはDTraceのLinuxアナログです。同様のタスクのサンプルスクリプトもあると思います。
学ぶ blktrace 。理論的には、その出力を解析できる可能性があります。これは、応答時間プログラムがread()
を取得するよりも、デバイスの待ち時間(サービス時間)が長くなります。
はいstrace
はすべてをトレースし(-e
フィルターを使用する場合でもすべてのシステムコール)、サーバーをロードし、プロセスをかなり遅くするため、適切ではない可能性があります。 Perf
は非常にあいまいなツールであり、出力を理解したと思う瞬間があるかもしれませんが、実際には理解していません。その機能セットはカーネルのバージョンに大きく依存しています。基本的におよび現在perf
は、CPU時間(サイクル)の測定に適していますが、[まだ]応答時間の測定には適していません(実際に必要です)。彼らはそれを容易にするために何かを実装したいと聞いたので、ごく最近の開発カーネルでは何かがあるかもしれません。 (さらに調査する場合は、perfスクリプト(perf script -l
)も確認してください。)
ftraceから何かを取得できる可能性があります。この記事を読んでください http://lwn.net/Articles/370423/ (そしてこれは イントロ です。)私が見ることができるように、pid
と関数によってトレースを制限することができます。次に、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();
ブロックデバイスへの「読み取り」または「書き込み」呼び出しの数のみに関心がある場合 これはRedHatのSOPそれを決定するための です。
ブロックダンプ機能とスクリプトのビットを使用して、プロセスが生成しているI/Oアクションに関する高レベルの概要を収集できます。これを行うには、以下を完了します。
システムロギングを短期間無効にします(データキャプチャの邪魔にならないようにします)。
#service syslog stop#echo 1>/proc/sys/vm/block_dump
Syslog(またはそれを使用している場合はrsyslog)を再度有効にしてから、iowaitの高い問題が発生するまで待ち、ブロックダンプを無効にします。
#service syslog start#echo 0>/proc/sys/vm/block_dump
次のコマンドを使用して、特定のプロセスによって発行されているREAD/WRITE/dirtiedアクションのdmesg出力を解析します。
#dmesg | awk '/(READ | WRITE | dirtied)/ {activity [$ 1] ++} END {for(x in activity)print x、activity [x]}' |並べ替え-nr -k 2,2 |頭-n10
kjournald(1425):5984 kjournald(3681):1269 pdflush(27301):725 iostat(2913):134 crond(26919):61 crond(28985):60 crond(7026):54 sshd(28175):50 sshd( 15388):50ノーチラス(24498):46
上記の出力例は、ブロックダンプの実行中にREAD、WRITE、およびダーティ操作を発行した上位10個のプロセスを示しています。このデータを使用して、プロセスが発行している操作の数の概要を収集でき、単一のプロセスがiowaitに大きく貢献しているかどうかを判断するのに役立ちます。
プロセスごとのiowait統計を提供し、スクリプトの一部として実行できるatopやiotopなどのコマンドラインツールもいくつかあります(つまり、特定のPIDに対して単一の反復を実行できるバッチモードがあります)。
編集:できるようにさらに調査を行う / proc/$ pid/statからプロセスごとのiowaitを取得 (検索「集約されたブロックI/O遅延」の場合)