2008年 3月 25日 火曜日
やっぱり Sun がスキ!
DTrace の profile プロバイダを使おう
今回は、DTrace のスクリプトを時間指定で終了させたい時や、一定間隔で 情報を取得したい時に便利な profile プロバイダを紹介します。
DTrace のスクリプトを終了する際、[Cntl + C] で強制終了させる場合が多い と思いますが、この場合、cron を使って決まった時間に DTrace を実行したい 時や、Shell スクリプトの中から DTrace を呼び出す時に [Cntl + C] を入力し ないと DTrace スクリプトが終了しない為不便です。
そんな時、 profile プロバイダが活躍します。
例えば、 10 秒間に write システムコールを発行したプロセスを調査したい時は、 下記 profile プロバイダを使用した sample-1.d のコーティングで対応可能です。
(sample-1.d)
#pragma D option quiet
dtrace:::BEGIN
{
i=10 ;
}
profile:::tick-1sec
/ i > 0 /
{
i = i - 1 ;
}
profile:::tick-1sec
/ i == 0 /
{
exit(0) ;
}
syscall::write:entry
{
@counts[execname] = count();
}
実行するには、下記コマンドを実行します。
# dtrace -s sample-1.d
[sample-1.d 解説]
まず、前処理(BEGIN)で変数 i に初期値 10(秒)を代入します。
メインのアクションでは、変数 i が 0 より大きい時 (i > 0) は、 i から 1 を引き、 i が 0 になった時点(i == 0)でスクリプトが終了します。
さらなる応用として、 DTrace の実行時間を固定でなく、実行時に引数として指定するには、 前処理の部分で初期値 10 の代わりに DTrace 実行時の引数 $1 として記述します。
#pragma D option quiet
dtrace:::BEGIN
{
i= $1 ;
}
.....
.....
(実行例) 3 秒でスクリプトを終了する
# dtrace -s sample-2.d 3
ちなみに、 "i = i - 1 ;" が記述されているアクション節の中にデータを取得する 文や中間結果を出力するプリント文を入れると一定間隔で意図した アクアションを実行できます。
[補足情報]
profile プロバイダの NAME tick-1sec の秒数は、任意に指定が可能で、5秒間隔 であれば tick-5sec と指定すればOKです。ちなみに、sec を忘れて tick-5 と 指定してしまうと、1 秒間に 5 回アクションを実行してしまうので気をつけて下さいね。
Posted at 05:49午後 3 25, 2008 by Naoyuki Yamada in Sun | 投稿されたコメント[0]
投稿されたコメント: