Solaris 动态跟踪指南

profile-n 探测器

profile-n 探测器在每个 CPU 中以高中断级别按固定的时间间隔触发。探测器的触发时间间隔以 n 值表示:中断源将每秒触发 n 次。n 也可带可选的时间前缀,在此情况下,n 将解释为由后缀表示的单位。表 19–1 中列出了有效的后缀和这些后缀表示的单位。

表 19–1 有效时间后缀

后缀 

时间单位 

nsecns

纳秒 

usecus

微秒 

msecms

毫秒 

secs

秒 

minm

分钟 

hourh

小时 

dayd

天 

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 探测器对所指定进程的当前优先级进行采样:

profile-1001
/pid == $1/
{
	@proc[execname] = lquantize(curlwpsinfo->pr_pri, 0, 100, 10);
}

要查看运行中的此示例脚本,请在一个窗口中键入下列命令:


$ echo $$
12345
$ while true ; do let i=0 ; done

在另一个窗口中运行 D 脚本一小段时间,用 echo 命令返回的 PID 替换 12345


# 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 

此输出显示了分时调度类的偏差。由于 shell 进程在 CPU 上旋转,因此其优先级经常会被系统降低。如果该 shell 进程运行不频繁,则其优先级将更高。要查看此结果,请在此旋转的 shell 中键入 Ctrl-C 组合键,然后再次运行脚本:


# dtrace -s ./profpri.d 494621
 dtrace: script './profpri.d' matched 1 probe

现在于 shell 中键入一些字符。终止 DTrace 脚本时,将会显示与以下示例类似的输出:


ksh                                               
           value  ------------- Distribution ------------- count    
              40 |                                         0        
              50 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 14       
              60 |                                         0

由于等待用户输入时 shell 进程进入休眠状态而不是在 CPU 中旋转,所以当真正运行时,它将以较高的优先级运行。