profile-n プローブは、各 CPU 上で、固定の間隔で起動します。割り込みレベルが高いという特徴があります。n はプローブの起動間隔を表しています。割り込みソースは、毎秒 n 回起動します。n には、時間の単位を表す接尾辞を付加できます。表 19–1 に、有効な接尾辞とその意味を示します。
表 19–1 有効な時間接尾辞
「サフィックス」 |
時間の単位 |
---|---|
nsec または ns |
ナノ秒 |
usec または us |
マイクロ秒 |
msec または ms |
ミリ秒 |
sec または s |
秒 |
min または m |
分 |
hour または h |
時間 |
day または d |
日 |
hz |
ヘルツ (秒当たりの回数) |
以下の例では、97 ヘルツで起動し、現在実行中のプロセスの情報を収集するプローブを作成します。
#pragma D option quiet profile-97 /pid != 0/ { @proc[pid, execname] = count(); } END { printf("%-8s %-40s %s\n", "PID", "CMD", "COUNT"); printa("%-8d %-40s %@d\n", @proc); }
この例をしばらく実行すると、次の例のような出力が得られます。
# dtrace -s ./prof.d ^C PID CMD COUNT 223887 sh 1 100360 httpd 1 100409 mibiisa 1 223887 uname 1 218848 sh 2 218984 adeptedit 2 100224 nscd 3 3 fsflush 4 2 pageout 6 100372 java 7 115279 xterm 7 100460 Xsun 7 100475 perfbar 9 223888 prstat 15 |
実行中のプロセスの情報は、profile-n プロバイダでも収集できます。次の D スクリプト例では、1,001 ヘルツのプロファイルプローブを使って、指定されたプロセスの現在の優先順位に関する情報を収集します。
profile-1001 /pid == $1/ { @proc[execname] = lquantize(curlwpsinfo->pr_pri, 0, 100, 10); }
このスクリプト例の動作を確認するには、まず、ウィンドウ内に次のコマンドを入力します。
$ echo $$ 12345 $ while true ; do let i=0 ; done |
別のウィンドウで D スクリプトを短時間間実行します。このとき、 12345 を echo コマンドから返された PID に置き換えてください。
# dtrace -s ./profpri.d 12345 dtrace: script './profpri.d' matched 1 probe ^C ksh value ------------- Distribution ------------- count < 0 | 0 0 |@@@@@@@@@@@@@@@@@@@@@ 7443 10 |@@@@@@ 2235 20 |@@@@ 1679 30 |@@@ 1119 40 |@ 560 50 |@ 554 60 | 0 |
タイムシェアリングスケジューリングクラスの分布状況が出力されます。シェルプロセスは CPU 上でスピン中なので、システムによる優先順位は常に低い状態です。シェルプロセスの実行頻度がさらに低ければ、優先順位は高くなります。この結果を確認するには、スピン中のシェルで Control-C キーを入力し、先ほどのスクリプトを再度実行します。
# dtrace -s ./profpri.d 494621 dtrace: script './profpri.d' matched 1 probe |
次に、同じシェルに何か文字を入力します。DTrace スクリプトを終了すると、次のような出力が得られます。
ksh value ------------- Distribution ------------- count 40 | 0 50 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 14 60 | 0 |
シェルプロセスは、CPU 上でスピンせず、ユーザー入力を待ってスリープしていました。このため、実際に実行されたときの優先順位がより高くなっています。