Solaris 動的トレースガイド

profile-n プローブ

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