OProfile使用指南
by chenny7@163.com,
updated on 2Nov. 2012.
1、Principles
OProfile主要是通过采样,利用CPU上的性能计数器(perfomance counter)统计某些事件的发生次数。它由内核模块和用户空间守护进程两部分组成,前者可以访问性能计数器,后者则负责从性能计数器收集数据。
OProfile有两种采样方式:基于事件的采样(performance counter)和基于时间的采样(timer)。前者需要CPU上性能计数器的支持,可以人为选择要profiling的事件类型;后者适用于无性能计数器的CPU,记录每一个时钟周期。
2、Configration
在Linux 2.6及其以上版本都以模块方式集成了OProfile,如要使用,首先加载OProfile内核模块,以root身份执行如下命令:
opcontrol --init
载入模块后会在/dev/oprofile/目录创建一些文件;卸载模块的命令:
opcontrol –deinit
在运行OProfile之前,需要使用opcontrol命令对其进行一些配置,配置选项保存在文件/root/.oprofile/daemonrc中。
2.1指定内核
监视内核:
opcontrol --vmlinux=/boot/vmlinux-`uname -r`
不监视内核:
opcontrol --no-vmlinux
2.2指定要监视的事件
opcontrol --setup --event=name:count:unitmask:kernal:user
其中,
name:事件名,可以通过opcontrol –l命令获取;
count:计数器值,即事件发生多少次后,oprofile记录一次;
unitmask:事件的掩码;
kernal:是否收集内核事件(0或者1);
user:是否收集用户事件(0或者1);
下面是一个小例子:
opcontrol --setup --event=CYCLES:1000::0:1
--event=ITLB_MISSES:1000::0:1
性能计数器0和1分别统计时钟和ITLB缺失事件,事件每发生1000次OProfile记录一次,CPU处于内核态不计数,处于用户态则计数。
注意:可以被同时监视的事件数量是由处理器的计数器数量决定的,不过,这并非一对一那么简单,某些事件必须被映射到指定的计数器上。要判定可用的计数器数量,执行下面的命令:
cat /dev/oprofile/cpu_type
根据显示的处理器类型,可以索引到可用计数器数量。
3、Profiling squid
首先要确保OProfile在测试机器上工作是否正常,可通过下面的命令查看:
cat /boot/config-`uname -r` | grep OPROFILE
应该有这样两行:
CONFIG_HAVE_OPROFILE=y
CONFIG_OPROFILE=m
如果没有则加上,CONFIG_OPROFILE=m表示编译成模块,CONFIG_HAVE_OPROFILE=y表示直接编译进内核。我一般会选择直接编译进内核。使用重新编译的内核启动机器,如果oprofile编成了模块,需要加载oprofile模块。
1、设置需要采样的事件:
opcontrol --setup --event=CPU_CLK_UNHALTED:10000:0:0:1
2、查看当前设置的状态,确保设置正确:
opcontrol --status
3、清除历史数据:
opcontrol --reset
4、启动数据收集:
opcontrol --start
5、运行测试程序:
/usr/local/squid/sbin/squid
6、由用户级守护进程取出统计数据
opcontrol --dump
7、停止数据收集:
opcontrol --stop
停止用户级守护进程
opcontrol --shutdown
8、读取数据:
方法一
cd /usr/local/squid/sbin/
opreport –l ./squid
输出的结果中:
Samples
采样到的次数
%
所占百分比
Symbol name
函数名
方法二
opgrof产生Gprof格式的数据
cd /usr/local/squid/sbin/
opgprof ./squid
该命令在当前目录下生成gmon.out文件;然后可以使用gprof工具进行进一步分析,甚至获得函数调用关系图(png图)。