使用perf record
命令可以profile
应用程序 (编译程序要使用-g
,推荐使用-g -O2
) :
perf record program [args]
或者在程序启动以后,使用-p pid
选项:
perf record -p pid
默认情况下,信息会存在perf.data
文件里,使用perf report
命令可以解析这个文件:
哪些函数占用CPU
比较多,一目了然。
另外,在使用perf record
时可以加--call-graph dwarf
选项:
--call-graph
Setup and enable call-graph (stack chain/backtrace) recording, implies -g.
Default is "fp".
采样结果如下:
关于Children
和Self
的含义,perf wiki给了一个详尽的解释。以下列代码为例:
void foo(void) {
/* do something */
}
void bar(void) {
/* do something */
foo();
}
int main(void) {
bar()
return 0;
}
Self
表示函数本身的overhead
:如果foo
函数的overhead
占60%
,那么bar
的Self overhead
就是40%
(刨除foo
所占部分)。因为foo
和bar
都是main
的子函数,所以二者的overhead
都要计算入main
的Children overhead
。
对于采用--call-graph dwarf
选项生成的perf.data
做出的火焰图如下: