一套 profiling 工具,透過分析結果可以得知程式運作這段期間,哪個 function 花費最多時間,哪一行程式碼被執行最多次。
下載
使用步驟
Initial and setup
$ opcontrol --init
$ opcontrol --reset
$ opcontrol --setup --no-vmlinux --separate=library
$ opcontrol --start
--separate=none: 只想看程式本身的 function
--separate=lib: 想連程式使用到的library都一起看到
適度調整取樣率
啟動想分析的 program
$ ./app
Stop
$ opcontrol --dump
$ opcontrol --stop
$ opcontrol -h
Analysis
$ opreport -l ./app
CPU: CPU with timer interrupt, speed 1999.97 MHz (estimated)
Profiling through timer interrupt
samples % image name symbol name
7251 30.3186 libx264.so.128 x264_cavlc_init
6247 26.1206 libx264.so.128 x264_coeff_level_run16
3018 12.6192 libx264.so.128 x264_analyse_init_costs encoder/analyse.c:292
1496 6.2552 libavcodec.so.52.72.2 /opt/ffmpeg-0.6.5/lib/libavcodec.so.52.72.2
1426 5.9625 libc-2.12.so __strcmp_sse42
1120 4.6831 libm-2.12.so __ieee754_log2f
384 1.6056 libavformat.so.52.64.2 /opt/ffmpeg-0.6.5/lib/libavformat.so.52.64.2
329 1.3756 libc-2.12.so memcpy
239 0.9993 libc-2.12.so _int_malloc
213 0.8906 libm-2.12.so __ieee754_pow
180 0.7526 libx264.so.128 x264_cqm_init
$ opannotate --source ./app
... (執行次數) (花費比例)
:static uint64_t pop_buffer_value(struct transient * trans)
11510 1.9661 :{ /* pop_buffer_value total: 89901 15.3566 */
: uint64_t val;
:
10227 1.7469 : if (!trans->remaining) {
: fprintf(stderr, "BUG: popping empty buffer !\n");
: exit(EXIT_FAILURE);
: }
:
: val = get_buffer_value(trans->buffer, 0);
2281 0.3896 : trans->remaining--;
2296 0.3922 : trans->buffer += kernel_pointer_size;
: return val;
10454 1.7857 :}
...
在 AWS EC2 上使用 oprofile
opcontrol --deinit
modprobe oprofile timer=1
opcontrol --reset
opcontrol --no-vmlinux --separate=library
opcontrol --start
參考資料