Solaris 动态跟踪指南

change-pri

抢占是根据优先级进行的,因此可能需要观察一段时间内优先级的变化。以下示例使用 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 中。