profile-n 探测器在每个 CPU 中以高中断级别按固定的时间间隔触发。探测器的触发时间间隔以 n 值表示:中断源将每秒触发 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 探测器对所指定进程的当前优先级进行采样:
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 中旋转,所以当真正运行时,它将以较高的优先级运行。