Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1299752
  • 博文数量: 554
  • 博客积分: 10425
  • 博客等级: 上将
  • 技术积分: 7555
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-09 09:49
文章分类

全部博文(554)

文章存档

2012年(1)

2011年(1)

2009年(8)

2008年(544)

分类:

2008-04-11 15:59:27


第19 章• profile 提供器219
< 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 中旋转,所以当真正运行时,它
将以较高的优先级运行。
profile-n 探测器
220 Solaris 动态跟踪指南• 2006 年7 月
tick-n 探测器
与profile-n 探测器一样,tick-n 探测器以高中断级别按固定时间间隔触发。但是,与在
每个CPU 中都触发的profile-n 探测器不同,tick-n 探测器仅按时间间隔在一个CPU 中触
发。实际的CPU 可能随时间变化。与profile-n 探测器一样,n 缺省为每秒的速率,但是也
可以带有可选的时间后缀。tick-n 探测器具有多种用途(例如提供某些定期输出或执行定
期操作)。
参数
profile 探测器的参数如下所示:
arg0 触发探测器时内核中的程序计数器(program counter, PC),如果在触发探测器
时内核中未执行当前进程,则为0
arg1 触发探测器时用户级进程中的程序计数器,如果在触发探测器时内核中正在
执行当前进程,则为0
从说明可以判断出,如果arg0 为非零值,则arg1 为零;如果arg0 为零,则arg1 为非零
值。因此,可以使用arg0 和arg1 来区分用户级和内核级,如以下简单示例所示:
profile-1ms
{
@ticks[arg0 ? "kernel" : "user"] = count();
}
计时器分辨率
profile 提供器使用操作系统中的任意分辨率间隔计时器。在不支持真正基于任意分辨率时
间中断的体系结构中,此频率受系统时钟频率的限制,由hz 内核变量指定。此类体系结构
中频率高于hz 的探测器将每隔1/hz 秒触发若干次。例如,这种体系结构中一个1000 赫兹的
profile 探测器(hz 设置为100)将每隔10 毫秒快速连续触发10 次。在支持任意分辨率的
平台上,1000 赫兹的profile 探测器将准确地每隔1 毫秒触发一次。
以下示例测试给定体系结构的分辨率:
profile-5000
{
计时器分辨率
第19 章• profile 提供器221
/*
* We divide by 1,000,000 to convert nanoseconds to milliseconds, and
* then we take the value mod 10 to get the current millisecond within
* a 10 millisecond window. On platforms that do not support truly
* arbitrary resolution profile probes, all of the profile-5000 probes
* will fire on roughly the same millisecond. On platforms that
* support a truly arbitrary resolution, the probe firings will be
* evenly distributed across the milliseconds.
*/
@ms = lquantize((timestamp / 1000000) % 10, 0, 10, 1);
}
tick-1sec
/i++ >= 10/
{
exit(0);
}
在支持任意分辨率profile 探测器的体系结构中,运行此示例脚本将产生均匀分布:
# dtrace -s ./restest.d
dtrace: script ’./restest.d’ matched 2 probes
CPU ID FUNCTION:NAME
0 33631 :tick-1sec
计时器分辨率
222 Solaris 动态跟踪指南• 2006 年7 月
value ------------- Distribution ------------- count
< 0 | 0
0 |@@@ 10760
1 |@@@@ 10842
2 |@@@@ 10861
3 |@@@ 10820
4 |@@@ 10819
5 |@@@ 10817
6 |@@@@ 10826
7 |@@@@ 10847
8 |@@@@ 10830
9 |@@@@ 10830
在不支持任意分辨率profile 探测器的体系结构中,运行此示例脚本将产生不均匀分布:
# dtrace -s ./restest.d
dtrace: script ’./restest.d’ matched 2 probes
CPU ID FUNCTION:NAME
0 28321 :tick-1sec
value ------------- Distribution ------------- count
4 | 0
5 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 107864
6 | 424
7 | 255
计时器分辨率
第19 章• profile 提供器223
8 | 496
9 | 0
在这些体系结构中,可在/etc/system 中手动调整hz,以提高有效的配置文件分辨率。
当前,UltraSPARC (sun4u) 的所有变体均支持任意分辨率profile 探测器。x86 体系结构
(i86pc) 的许多变体也支持任意分辨率profile 探测器,但是一些较旧的变体不支持。
探测器创建
与其他提供器不同,profile 提供器根据需要动态创建探测器。因此,所需的profile 探测器
可能并未在所有探测器列表中显示(例如,通过使用dtrace -l -P profile),但在显式启
用该探测器时将会创建它。
在支持任意分辨率profile 探测器的体系结构中,时间间隔太短将导致计算机连续产生基于
时间的中断,从而拒绝计算机上的服务。为了防止出现这种情况,profile 提供器将自动拒
绝创建会导致时间间隔小于两百微秒的任何探测器。
稳定性
profile 提供器使用DTrace 的稳定性机制说明其稳定性,如下表所示。有关稳定性机制的
更多信息,请参见第39 章。
元素名称稳定性数据稳定性相关性类
提供器发展中发展中公用
模块不稳定不稳定未知
函数专用专用未知
名称发展中发展中公用
参数发展中发展中公用
探测器创建
224 Solaris 动态跟踪指南• 2006 年7 月
fbt 提供器
本章介绍函数边界跟踪(Function Boundary Tracing, FBT) 提供器,该提供器提供了与进入和
返回Solaris 内核中的大多数函数相关的探测器。函数是程序文本的基本组成单元。在设计
完善的系统中,每个函数会对指定的对象或一系列类似对象执行独立和定义完善的操作。
所以,即使在最小型的Solaris 系统中,FBT 也将提供20,000 个探测器。
与其他DTrace 提供器类似,在没有显式启用FBT 提供器时,它不会产生探测效果。启用
时,FBT 仅在被探测的函数中产生探测效果。虽然FBT 实现高度特定于指令集体系结构,
但在SPARC 和x86 平台上都已实现FBT。对于每一个指令集,都有少量函数不调用其他函
数,且由无法通过FBT 检测的编译器(所谓的叶函数)高度优化。DTrace 中不存在这些函
数的探测器。
要有效使用FBT 探测器,需要对操作系统的实现有所了解。所以,建议您仅在开发内核软
件或者其他提供器不满足要求时,才使用FBT。其他DTrace 提供器(包括syscall、
sched、proc 和io)都可用于回答大多数系统分析问题,不需要了解操作系统实现的知识。
探测器
在内核中大多数函数的边界,FBT 都提供了探测器。进入函数和从函数返回都会跨越函数
边界。因此,FBT 为内核中的每个函数提供了两个探测器:一个用于进入函数时,一个用
于从函数返回时。这两个探测器的名称分别为entry 和return。函数名称和模块名称都指
定为探测器的一部分。所有FBT 探测器都指定了函数名称和模块名称。
探测器参数
entry 探测器
entry 探测器的参数与相应操作系统内核函数的参数相同。可以使用args[] 数组以键入的
方式访问这些参数。可以使用arg0 .. argn 变量,以访问int64_t 参数的方式访问这些参
数。
20 第2 0 章
225
return 探测器
虽然给定的函数仅有一个进入点,但它可能有许多不同的位置可返回到其调用方。通常,
您可能只关心函数所返回的值或函数是否返回,而不关心所采用的具体返回路径。因此,
FBT 将函数的多个返回位置收集到单个return 探测器中。如果您对确切的返回路径感兴
趣,可以检查return 探测器的args[0] 值,该值表示函数文本中返回指令的偏移量(以字
节为单位)。
如果函数具有返回值,则该返回值存储在args[1] 中。如果函数不具有返回值,则不会定义
args[1]。
示例
可以使用FBT 轻松地了解内核的实现。以下示例脚本记录来自任何xclock 进程的第一个
ioctl(2),以及一直到内核的后续代码路径:
/*
* To make the output more readable, we want to indent every function entry
* (and unindent every function return). This is done by setting the
* "flowindent" option.
*/
#pragma D option flowindent
syscall::ioctl:entry
/execname == "xclock" && guard++ == 0/
{
self->traceme = 1;
printf("fd: %d", arg0);
}
fbt:::
示例
226 Solaris 动态跟踪指南• 2006 年7 月
/self->traceme/
{}
syscall::ioctl:return
/self->traceme/
{
self->traceme = 0;
exit(0);
}
运行此脚本将会生成与以下示例类似的输出:
# dtrace -s ./xioctl.d
dtrace: script ’./xioctl.d’ matched 26254 probes
CPU FUNCTION
0 => ioctl fd: 3
0 -> ioctl
0 -> getf
0 -> set_active_fd
0 <- set_active_fd
0 <- getf
0 -> fop_ioctl
0 -> sock_ioctl
0 -> strioctl
0 -> job_control_type
0 <- job_control_type
 
以上文章转自于 : http://developers.sun.com.cn/
阅读(475) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~