抢占是根据优先级进行的,因此可能需要观察一段时间内优先级的变化。以下示例使用 change-pri 探测器来显示此信息:
sched:::change-pri
{
@[stringof(args[0]->pr_clname)] =
lquantize(args[2] - args[0]->pr_pri, -50, 50, 5);
}
示例脚本捕获优先级升高或降低的程度,并按调度类聚集。运行上面的脚本将会生成与以下示例类似的输出:
# dtrace -s ./pri.d
dtrace: script './pri.d' matched 10 probes
^C
IA
value -------------- Distribution ------------ count
< -50 | 20
-50 |@ 38
-45 | 4
-40 | 13
-35 | 12
-30 | 18
-25 | 18
-20 | 23
-15 | 6
-10 |@@@@@@@@ 201
-5 |@@@@@@ 160
0 |@@@@@ 138
5 |@ 47
10 |@@ 66
15 |@ 36
20 |@ 26
25 |@ 28
30 | 18
35 | 22
40 | 8
45 | 11
>= 50 |@ 34
TS
value -------------- Distribution ------------ count
-15 | 0
-10 |@ 1
-5 |@@@@@@@@@@@@ 7
0 |@@@@@@@@@@@@@@@@@@@@ 12
5 | 0
10 |@@@@@ 3
15 | 0
|
输出显示交互 (Interactive, IA) 调度类的优先级处理。您可能不需要查看优先级处理,而只需要查看一段时间内特定进程和线程的优先级值。以下脚本使用 change-pri 探测器来显示此信息:
#pragma D option quiet
BEGIN
{
start = timestamp;
}
sched:::change-pri
/args[1]->pr_pid == $1 && args[0]->pr_lwpid == $2/
{
printf("%d %d\n", timestamp - start, args[2]);
}
tick-1sec
/++n == 5/
{
exit(0);
}
要查看一段时间内优先级的变化 ,请在一个窗口中键入以下命令:
$ echo $$ 139208 $ while true ; do let i=0 ; done |
在另一个窗口中运行该脚本并将输出重定向到文件:
# dtrace -s ./pritime.d 139208 1 > /tmp/pritime.out # |
可将上面生成的文件 /tmp/pritime.out 用作绘图软件的输入,以图形方式显示一段时间内的优先级。gnuplot 是免费提供的绘图软件包,它包括在 Solaris 免费软件配套 CD 中。缺省情况下,gnuplot 安装在 /opt/sfw/bin 中。