2011/08/08

Oprofile - program performance analysis

一套 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


參考資料


沒有留言:

張貼留言