在运行 OProfile 之前,它必须被配置。至少需要选择是否要监视内核。以下各节描述了如何使用 opcontrol 工具来配置 OProfile。在 opcontrol 命令被执行时,设置选项就会被保存到 /root/.oprofile/daemonrc 文件中。
首先,配置 OProfile 是否应该监视内核。这是在启动 OProfile 前唯一所需的配置选项。其它选项都是可选的。
要监视内核,以根用户身份执行以下命令:
opcontrol --vmlinux=/boot/vmlinux-`uname -r` |
要配置 OProfile 不监视内核,以根用户身份执行以下命令:
opcontrol --no-vmlinux |
这个命令还会载入 oprofile 内核模块(如果还没有被载入),并创建 /dev/oprofile/ 目录(如果不存在)。关于这个目录的详情,请参阅第 43.6 节。
注记 | |
---|---|
即便 OProfile 被配置成不为内核建档,SMP 内核仍旧必须运行,这样,oprofile 模块才会被载入。 |
设置样品是否应在内核中收集只会改变所收集的数据,而不会改变收集数据的方法或贮存地点。要为内核和应用程序库生成不同的样品文件,请参阅第 43.2.3 节。
多数处理器包含计数器(counters)。它们被 OProfile 用来监视指定的事件。如表 43-2所示,可用的计数器的数量要根据处理器而定。
处理器 | cpu_type | 计数器数量 |
---|---|---|
Pentium Pro | i386/ppro | 2 |
Pentium II | i386/pii | 2 |
Pentium III | i386/piii | 2 |
Pentium 4 (无超线程) | i386/p4 | 8 |
Pentium 4 (有超线程) | i386/p4-ht | 4 |
Athlon | i386/athlon | 4 |
AMD64 | x86-64/hammer | 4 |
Itanium | ia64/itanium | 4 |
Itanium 2 | ia64/itanium2 | 4 |
TIMER_INT | 计时器(timer) | 1 |
IBM eServer iSeries | 计时器(timer) | 1 |
IBM eServer pSeries | 计时器(timer) | 1 |
IBM eServer S/390 | 计时器(timer) | 1 |
IBM eServer zSeries | 计时器(timer) | 1 |
表 43-2. OProfile 处理器和计数器
使用表 43-2的信息来校验所检测到的处理器类型是否正确,并且判定能够被同时监视的事件数量。如果处理器没有支持的性能监视硬件,计时器(timer)就会被用作处理器类型。
如果使用了 timer,事件就不能为任何处理器设置,因为硬件不支持硬件性能计数器。相反,计时器中断会被用来建档。
如果 timer 没有被用作处理器类型,监视的事件就可以被改变,处理器的计数器0就会被默认设置为基于时间的事件。如果处理器上有多个计数器,0以外的计数器就不会被默认设置任何事件。被监视的默认事件显示在表 43-3中。
处理器 | 计数器0的默认事件 | 描述 |
---|---|---|
Pentium Pro, Pentium II, Pentium III, Athlon, AMD64 | CPU_CLK_UNHALTED | 处理器的时钟没有停止 |
Pentium 4 (HT 和非 HT) | GLOBAL_POWER_EVENTS | 处理器没有停止的时间 |
Itanium 2 | CPU_CYCLES | CPU 周期 |
TIMER_INT | (none) | 每个计时器中断的抽样 |
表 43-3. 默认事件
可以被同时监视的事件数量是由处理器的计数器数量决定的。不过,这不是一对一的情况;在某些处理器上,某些事件必须被映射到指定的计数器上。要判定可用的计数器数量,执行以下命令:
cat /dev/oprofile/cpu_type |
可用的事件要根据处理器类型而定。要判定可被建档的事件,以根用户身份执行以下命令(该列表是针对系统处理器类型特有的):
op_help |
每个计数器的事件都可以通过命令行被配置,也可以使用图形化界面配置。如果计数器没有被设置给指定的事件,错误消息就会被显示。
要通过命令行来为每个可配置的计数器设置事件,使用 opcontrol:
opcontrol --ctrlN-event=<event-name> |
把 N 替换成计数器号码(从0开始),把 <event-name> 替换成 op_help 中显示的确切事件名称。
默认设置会选择基于时间的事件设置。它大约会创建每处理器每秒2000个样品。如果使用了计时器中断,计时器就被设置成两幅画面的最小时间间隔率,而且还不能被用户设置。如果 cpu_type 不是 timer,每个事件就必须设置了一个抽样率(sampling rate)。抽样率是每次抽样之间发生的事件数量。
在为计数器设置事件时,还可以指定一个抽样率:
opcontrol --ctrN-event=<event-name> --ctrN-count=<sample-rate> |
把 <sample-rate> 替换成再次抽样前要等待的事件数量。这个值越小,抽样的频率就越高。对于不常发生的事件,你可能需要使用一个较小的值才能捕获事件实例。
小心 | |
---|---|
在设置抽样率时务必小心。抽样率太频繁会使系统超载,导致系统似乎僵住或者真的僵住了。 |
按照默认设置,每个事件都收集内核模式和用户模式的信息。要配置 OProfile 在某个指定的计数器中不计数内核模式的事件,执行以下命令(这里的 N 是计数器号码):
opcontrol --ctrN-kernel=0 |
执行以下命令来再次启动计数器的建档内核模式:
opcontrol --ctrN-kernel=1 |
要配置 OProfile 不计数某个指定计数器的用户模式的事件,执行以下命令(这里的 N 是计数器号码):
opcontrol --ctrN-user=0 |
执行以下命令来再次启动计数器的建档用户模式:
opcontrol --ctrN-user=1 |
当 OProfile 守护进程把档案数据写入样品文件,它可以把内核和库档案的数据分成两个单独的样品文件。要配置守护进程写入样品文件的方式,以根用户身份执行以下命令:
opcontrol --separate=<choice> |
<choice> 可以是以下之一:
none — 不要分离档案(默认)
library — 为库生成每个应用程序的档案
kernel — 为内核和内核模块生成每个应用程序的档案
all — 为库生成每个应用程序的档案,为内核和内核模块生成每个应用程序的档案
如果 --separate=library 被使用,抽样文件名在包括可执行文件名称的同时还包括库的名称。