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 上でスピンせず、ユーザー入力を待ってスリープしていました。このため、実際に実行されたときの優先順位がより高くなっています。