43.2. 配置 OProfile

在运行 OProfile 之前,它必须被配置。至少需要选择是否要监视内核。以下各节描述了如何使用 opcontrol 工具来配置 OProfile。在 opcontrol 命令被执行时,设置选项就会被保存到 /root/.oprofile/daemonrc 文件中。

43.2.1. 指定内核

首先,配置 OProfile 是否应该监视内核。这是在启动 OProfile 前唯一所需的配置选项。其它选项都是可选的。

要监视内核,以根用户身份执行以下命令:

opcontrol --vmlinux=/boot/vmlinux-`uname -r`

要配置 OProfile 不监视内核,以根用户身份执行以下命令:

opcontrol --no-vmlinux

这个命令还会载入 oprofile 内核模块(如果还没有被载入),并创建 /dev/oprofile/ 目录(如果不存在)。关于这个目录的详情,请参阅第 43.6 节

注记注记
 

即便 OProfile 被配置成不为内核建档,SMP 内核仍旧必须运行,这样,oprofile 模块才会被载入。

设置样品是否应在内核中收集只会改变所收集的数据,而不会改变收集数据的方法或贮存地点。要为内核和应用程序库生成不同的样品文件,请参阅第 43.2.3 节

43.2.2. 设置要监视的事件

多数处理器包含计数器(counters)。它们被 OProfile 用来监视指定的事件。如表 43-2所示,可用的计数器的数量要根据处理器而定。

处理器cpu_type计数器数量
Pentium Proi386/ppro2
Pentium IIi386/pii2
Pentium IIIi386/piii2
Pentium 4 (无超线程)i386/p48
Pentium 4 (有超线程)i386/p4-ht4
Athloni386/athlon4
AMD64x86-64/hammer4
Itaniumia64/itanium4
Itanium 2ia64/itanium24
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, AMD64CPU_CLK_UNHALTED处理器的时钟没有停止
Pentium 4 (HT 和非 HT)GLOBAL_POWER_EVENTS处理器没有停止的时间
Itanium 2CPU_CYCLESCPU 周期
TIMER_INT(none)每个计时器中断的抽样

表 43-3. 默认事件

可以被同时监视的事件数量是由处理器的计数器数量决定的。不过,这不是一对一的情况;在某些处理器上,某些事件必须被映射到指定的计数器上。要判定可用的计数器数量,执行以下命令:

cat /dev/oprofile/cpu_type

可用的事件要根据处理器类型而定。要判定可被建档的事件,以根用户身份执行以下命令(该列表是针对系统处理器类型特有的):

op_help

每个计数器的事件都可以通过命令行被配置,也可以使用图形化界面配置。如果计数器没有被设置给指定的事件,错误消息就会被显示。

要通过命令行来为每个可配置的计数器设置事件,使用 opcontrol

opcontrol --ctrlN-event=<event-name>

N 替换成计数器号码(从0开始),把 <event-name> 替换成 op_help 中显示的确切事件名称。

43.2.2.1. 抽样率

默认设置会选择基于时间的事件设置。它大约会创建每处理器每秒2000个样品。如果使用了计时器中断,计时器就被设置成两幅画面的最小时间间隔率,而且还不能被用户设置。如果 cpu_type 不是 timer,每个事件就必须设置了一个抽样率(sampling rate)。抽样率是每次抽样之间发生的事件数量。

在为计数器设置事件时,还可以指定一个抽样率:

opcontrol --ctrN-event=<event-name> --ctrN-count=<sample-rate>

<sample-rate> 替换成再次抽样前要等待的事件数量。这个值越小,抽样的频率就越高。对于不常发生的事件,你可能需要使用一个较小的值才能捕获事件实例。

小心小心
 

在设置抽样率时务必小心。抽样率太频繁会使系统超载,导致系统似乎僵住或者真的僵住了。

43.2.2.2. 单元屏蔽

如果 cpu_type 不是 timer,那么就可能还需要单元屏蔽(unit masks)来进一步确定事件。

每个事件的单元屏蔽可以使用 op_help 命令列举。每个单元屏蔽的值都以十六进制格式显示。要指定一个以上单元屏蔽,十六进制的值必须使用逐位“或”(or)算符来组合。

opcontrol --ctrN-event=<event-name> --ctrN-count=<sample-rate> --ctrN-unit-mask=<value>

43.2.3. 分离内核和用户空间档案

按照默认设置,每个事件都收集内核模式和用户模式的信息。要配置 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> 可以是以下之一:

如果 --separate=library 被使用,抽样文件名在包括可执行文件名称的同时还包括库的名称。