Tuesday, November 16, 2010

[Linux]Profiling

gprof

gprof是GNU的profiling工具,使用的时候需要编译期的支持
使用:
1 编译:时需要使用"-pg"选项
$cc -g -c myprog.c utils.c -pg
$cc -o myprog myprog.o utils.o -pg
如果加上了"-g"选项(如上),则可以支持Line-by-line Profiling
2 运行: 执行生成的可执行文件(比如上面的myprof), 这时会生成一个"gmon.out"的文件
3 查看: 用gprof 查看profiling结果
$gprof myprof | more
参考:
gprof Quick-Start Guide

perf

perf是Linux下非常强大的profiling工具,也非常好用.
perf类似于git那样,有一堆子命令,比较常用的有record,report,annotate,stat等.
运行一个程序foo并记录下profile(默认为perf.data):
$ sudo perf record ./foo
读取刚才生成的profile结果(默认perf.data)并显示分析结果:
$ sudo perf report
输出结果类似
    49.97%  foo  filter_bench         [.] main
     5.31%  foo  libc-2.12.1.so       [.] 0x7aeab
     0.36%  foo  libstdc++.so.6.0.15  [.] operator new[](unsigned long)
注意这里libc-2.12.1.so中的symbol没有被load进来,所以无法显示具体的函数名而只能看见一个入口地址0x7aeab.
在ubuntu/debian上你可以安装libc6-dbg(注意不是libc6-dev)帮助gdb,perf这样的工具traceback.libc6-dbg包含了libc6的debug信息
$ apt-get install libc6-dbg
显示annotated code
$ sudo perf annotate
运行一个命令并查看硬件counter:
$ perf stat --repeat 10 -e cycles:u \
-e instructions:u -e l1-dcache-loads:u -e l1-dcache-load-misses:u ./foo
查看所有支持的硬件counter:
$ perf list
参考:
Linux kernel profiling with perf

OProfile

OProfile利用硬件支持来profile系统或者application. 与gprof不同,OProfile不会在binary中添加指令
启动:
1 加载oprofile
$sudo opcontrol --init
2 设置是否需要profile kernel,如果需要
$sudo opcontrol --vmlinux=/boot/vmlinux-`uname -r`
如果不需要
$sudo opcontrol --no-vmlinux
3 开始采集数据
$sudo opcontrol --start 
Using default event: CPU_CLK_UNHALTED:100000:0:1:1
Using 2.6+ OProfile kernel interface.
Using log file /home/apc999/tempsession/samples/oprofiled.log
Daemon started.
Profiler running.
4 查看oprofile状态
$sudo opcontrol --status
Daemon running: pid 13892
Separate options: none
vmlinux file: none
Image filter: none
Call-graph depth: 0
5 结束采集数据
$sudo opcontrol --stop 
6 结束oprofile daemon
$sudo opcontrol --shutdown 

参考:
OProfile Manual

No comments: