本文假设你对基本的Dtrace技术已经熟悉了,例如探针(Probes)、谓词(Predicate)、操作(Action)等概念已经比较熟悉了。
我们在这篇文章中将介绍一些关于Dtrace使用的技巧、提示和窍门。本文依照的是Byan Cantrill,Mike Shapire和Adam Leventhal所写的”Advacned Dtrace-Tips,Tricks and Gotchas”里面介绍的提示、技巧和窍门并不遵照某一顺序。
Dtrace提示(Tips)
提示是用来指出哪些在大部分在文档中已经写出的,但是并不被人们知道和重视的一些使用技术。本文将列举一些其中的使用技术,但是如果想更详细的了解全部内容,请参照Dtrace文档,如《Dtrace动态跟踪指南》。
Dtrace技巧(Tricks)
有一些Dtrace的技术不是显见的,并且文档中也很少涉及。有一些技巧是用来对付Dtrace现有的一些限制和不足的,这些Dtrace的限制有的正在被改进,这样一些技巧在以后的新的版本的Dtrace出现之时就会用不上了。
Dtrace窍门(Gotahcs)
和任何一个系统一样,Dtrace也有一些容易让新手掉进去的陷阱,还有一些会让Dtrace专家掉进去。Dtrace的设计者尽量减少这样的陷阱,但是这样的陷阱还是一个很流行的问题。有一些陷阱在文档中已经提出,但是并没有把他们归在一个地方。
好我们开始今天的探索之旅吧!
Tip: 正规化聚会结果 Normalizing aggregation
* 在很多情况下,我们更希望得到的是不是一个决定的数值,而是一个单位量内发生的率,例如每秒的系统调用次数,每一个事务(Transaction)发生I/O操作的次数。
* 在Dtrace中,聚会结果可通过正规化来转化成一个单位量内发生的率。
* 其格式为”normalize(@agg,n)” ,其中agg是聚会变量,n是任意一个Dtrace表达式
Tip:clear和tick探针
* clear探针可以将聚合变量清零
* 使用tick探针定期将聚合变量清零,这样就可以侦测在周期时间内的各个系统参数
io:::start
{
@[execname] = count();
}
tick-1sec
{
printa(“%40s %@d\n”, @);
clear(@);
}
Tip: 使用stop终止进程
* 在某些情况下,用户希望停止一个进程,使用传统的一些debugger(如:DBX,MDB)来进行后续的调试
* 可以使用stop可以完成上述任务
#pragma D option destructive
io:::start
/execname == “java”/
{
printf(“stopping %d...”, pid);
stop();
}
Trick: 有条件的断点(Conditional Breakpoints)
* 现有的条件断点机制仅仅限于非常简单的条件
* 使用stop操作和pid提供者可以制作更多更丰富的条件断点
* 例如:基于如下的断点:
- 返回值(Return Value)
- 函数参数值(Argument Value)
- 延迟值(Latency)
Gotcha: 程序运行到极限了
* 如果你尝试启动巨大的D 脚本,例如启动很多探针或很多操作,你会发现Dtrace拒绝执行脚本:
dtrace: failed to enable './biggie.d': DIF
program exceeds maximum program size
* 这时你可以改变一些参数来让你的脚步执行,在/etc/system 改变dtrace_dot_maxsize或通过”mdb -kw”命令,默认的大小是256k
阅读(701) | 评论(0) | 转发(0) |