|
该系列前面的文章:
OpenSolaris新特性解析之一:Opensolaris之前身今世 http://bbs.chinaunix.net/viewthread.php?tid=1221539
OpenSolaris新特性解析之二:ZFS http://bbs.chinaunix.net/viewthread.php?tid=1234907
OpenSolaris新特性解析之三:SMF http://bbs.chinaunix.net/viewthread.php?tid=1273723
OpenSolaris新特性解析之四:FMA http://bbs.chinaunix.net/viewthread.php?tid=1295237
OpenSolaris新特性解析之五: dtrace1-基础 http://bbs.chinaunix.net/viewthread.php?tid=1315928
OpenSolaris新特性解析之五: dtrace2-语法 http://bbs2.chinaunix.net/viewthread.php?tid=1353868
OpenSolaris新特性解析之五: dtrace3-dtrace工具集 http://bbs.chinaunix.net/viewthread.php?tid=1373277
这部分准备为大家分析两个dtrace实例程序,建议在这部分之前先看看dtrace的前面3个部分。
第一个例子比较简单,我们知道在进程切换的时候是很耗费系统资源和时间的,如果进程的上下文切换次数过多,将耗费比较多的系统资源,降低系统运行的效率。那如何来检测系统的上下文切换次数呢?
我们来看下面的D语言代码:
#!/usr/bin/dtrace -s
sysinfo:::pswitch
{
@[execname] = count();
}
第一句是千古不变的话#!/usr/bin/dtrace -s,表明这个脚本是dtrace的脚本,需要用dtrace命令来解析脚本来解析,如果这个脚本的名字叫做a.d的话,我们给这个脚本加上可执行的属性 chmod +x a.d,然后可以直接在shell里面执行,这个时候shell就根据这句话知道这个脚本需要用dtrace来解析的。
sysinfo:::pswitch这句话表明了我们需要监控的探测点,sysinfo:::pswitch就是这个探测点的名字,sysinfo是这个提供这个探测点的内核提供者的名字,所有的探测点都是由dtrace的内核部分提供的,这就是dtrace可以做你想做的任何事情的原因。 sysinfo: : :看到三个冒号之间没有填任何内容,第一个冒号和第二个冒号之间是需要调试的模块的名字,这里没有填写任何内容,表明我们想匹配sysinfo提供的所有模块,第二个冒号和第三个冒号之间也是空的,这里本来需要填写你想调试的函数的名字,我们没有填写,表明我们想匹配sysinfo提供的所有函数,最后一个pswitch是个入口,pswitch这个入口代表了内核中的上下文切换的发生。这个探测点总的意思就是在内核中上下文切换发生的时候,系统你要先帮我执行下面的内容,然后再进行上下文切换,具体执行什么内容呢?就是你用D语言写成的代码,在我们这个例子里面就是 @[execname] = count();
execname是dtrace的内置的变量,含义是可执行程序的名字,比如firefox-bin,这个就是firefox对应的可执行程序的名字,count是dtrace的内置函数,含义就是统计次数,@符号是表明这是个聚合,聚合的概念请看dtrace的前面几篇文章。
我们刚才说这段代码是在上下文切换的时候,在系统的上下文切换代码执行之前执行的,执行的时候就是统计次数,并且根据聚合的概念,这里是根据 execname来分类统计,就是根据应用程序来分类统计。我们看到这里,这个程序的含义已经很清楚了,就是统计各个应用程序上下文切换的次数,大家可以执行下,看下结果。怎么执行,请参考dtrace的前面几篇文章。
例子二:
#!/usr/sbin/dtrace -s
pid$1:a.out:main:
{
}
大家再来看看这个例子,pid也是dtrace在内核中的一部分,用于调试进程相关的信息,pid其实就是process id。$1就是你调用这个脚本的时候输入的第一个参数,在这个例子里面我们需要进程的进程号来作为参数。比如这个脚本的名字叫做b.d,那这个脚本的用法就是./b.d 1000,1000是我们想要调试的进程的进程号,这里$1的用法和bash脚本里面的用法是一致的。a.out是模块的名字,也就是1000这个进程对应的那个可执行程序的名字,我们知道在编译的时候,如果不加参数的时候,默认输出的可执行程序的名字就是a.out,main,我们想要调试的函数的名字,这里我们指定了主函数main。然后我们看到四元项里面少了最后一项(四元项请参考dtrace前面的几篇文章),在这里我们没有写最后一项,是想匹配main函数里面的任何位置。
函数体内部什么都没有写,这里dtrace默认将把main函数里面正在执行的语句打印出来。
这里有个问题,我们为什么不写四元项里面的最后一项?
原因在于说,我们在执行这个dtrace脚本的时候,我们不知道a.out这个可执行程序执行到了哪一行,可能当时main正执行到第三行,可能正执行到第五行,所以我们没有写最后一项,希望这个探测点可以从正在执行的任意一行开始匹配。
在dtrace部分的前面的文章中,也有一些例子,如果把这些例子全部都看一遍,执行一遍,我想可以说dtrace已经入门了。
通过这些例子,我们可以看到其实dtrace本身并不复杂,但是要想真正把dtrace用起来,成为自己手中的一个利器,需要对solaris的内核有一定的了解,并且看足够多的dtrace使用实例和用法,如果真的做到这步,那dtrace将成为你手中最好用的一个工具。
对于dtrace这部分,这篇是最后的一篇文章,dtrace部分就结束了。最后想有兴趣的朋友,推荐本书<solaris性能与工具>,如果大家能够把这本书里面的dtrace实例每一个都学习一遍的话,你将有能力观测到系统中你感兴趣的任何一个方面,书不用多,就这一本经典的就够了。 |
|