使用oprofile进行cpu使用情况检测,需要经过初始化、启动检测、导出检测数据、查看检测结果等步骤,以下为常用的oprofile命令。
初始化
- opcontrol --no-vmlinux : 指示oprofile启动检测后,不记录内核模块、内核代码相关统计数据
- opcontrol --init : 加载oprofile模块、oprofile驱动程序
检测控制
- opcontrol --start : 指示oprofile启动检测
- opcontrol --dump : 指示将oprofile检测到的数据写入文件
- opcontrol --reset : 清空之前检测的数据记录
- opcontrol -h : 关闭oprofile进程
查看检测结果
- opreport : 以镜像(image)的角度显示检测结果,进程、动态库、内核模块属于镜像范畴
- opreport -l : 以函数的角度显示检测结果
- opreport -l test : 以函数的角度,针对test进程显示检测结果
- opannotate -s test : 以代码的角度,针对test进程显示检测结果
- opannotate -s /lib64/libc-2.4.so : 以代码的角度,针对libc-2.4.so库显示检测结果
- opcontrol --status:查看当前设置的状态,确保设置正确
一般来说,我们做应用程序的性能测试不需要关注内核的性能。另外需要关注cpu的周期事件,因此需要进行如下设置
opcontrol --setup --event=eventname:count:unitmask:kernel:user |
这里解释一下event参数的各个项的意思:
项 | 说明 |
eventname | 要关注的事件名称,常用的事件名称及功能如下: CPU_CLK_UNHALTED: CPU的执行时间,性能测试时最常用的事件 DTLB_MISSES: 数据TLB失效情况。 |
count | 事件抽样频率,oprofile并不是对每次事件都进行记录,而是进行抽样,每多少次事件进行一次数据收集,如果抽样太低,会导致事件数据的收集占用太多的cpu.因此每个事件,oprofile给了一个最小值,每类事件的最小值可以通过opcontrol --list-events查到。 |
unitmask | 事件的掩码,通过opcontrol --list-events可查看相应事件的掩码意义,这里不细说了。 |
kernel | 是否收集内核的事件。0表示不收集,1表示收集。 |
user | 是否收集用户的事件。0表示不收集,1表示收集。 |
对性能测试时,一般使用的设置参数如下:
opcontrol --setup --event=CPU_CLK_UNHALTED:10000:0:0:1
常见步骤:
1.echo 0 > /proc/sys/kernel/nmi_watchdog
2.opcontrol --init
3.opcontrol --vmlinux=xxx/xxx/xxx/vmlinux或者 opcontrol --no-vmlinux
4.opcontrol --reset
5.opcontrol --start
6. 运行程序
7.opcontrol --dump
8.opcontrol --stop
9.opcontrol --shutdown
10.opcontrol --deinit
11.opannotate --source 运行程序路径名
12.opreport -l 运行程序路径名