爲了瞭解程序的執行時間以及各個函數之間的調用關係,能夠經過Google的gperftool來統計函數之間的關係以及時間信息。經過分析每一個函數的時間信息,就能夠看程序的關鍵消耗點在什麼地方。sql
1. 安裝網絡
gperftools:http://code.google.com/p/gperftools/downloads/list多線程
libunwind:http://download.savannah.gnu.org/releases/libunwind/函數
64位操做系統須要安裝libunwind,官方推薦版本是libunwind-0.99-beta工具
安裝過程:./configure [--disable-shared] && make && make installpost
Graphviz是一個由AT&T實驗室啓動的開源工具包,用於繪製DOT語言腳本描述的圖形,gperftools依靠此工具生成圖形分析結果。google
安裝命令:yum install graphviz操作系統
2. 用法線程
1)在目標文件中加入#include <google/profiler.h>,在程序開始處加入ProfilerStart("my.prof"),在程序結束處加入ProfilerStop().code
2)在編譯鏈接時,須要連接libprofiler庫,64位操做系統同時連接libunwind庫。
3)若是是在多線程中,能夠採用下面的形式來控制:
#include <google/profiler.h> static int is_record = 0; if (is_record == 0) { ProfilerStart("my.prof"); } if (is_record == 0) { ProfilerStop(); is_record = 1; }
設置好上面的代碼後,從新編譯完成。直接運行便可。運行完成後就會生成my.prof文件。我在中間件pgoneproxy中增長後直接運行,就能夠直接生成my.prof文件。可是在postgersql的psql的源碼中增長後運行結束確不能生成。後面再網絡上上面找到執行方式:env CPUPROFILE=./my.prof ./psql -h 127.0.0.1 -p 5432 -U db_user pgbench。安裝這種執行方式確可以生成文件my.prof文件。
3. 分析輸出
pprof腳本用於分析profile文件並輸出結果,包括文本和圖形兩種輸出風格。
例如:/urs/local/pgsql/bin/psql是目標程序,my.prof是profile文件
生成文本風格結果:pprof --text /urs/local/pgsql/bin/psql my.prof > profile.txt
生成圖形風格結果:pprof --pdf /urs/local/pgsql/bin/psql my.prof > profile.pdf
4. 結果展現
下圖是pgoneproxy中生成的pdf格式的結果的部分截圖,從圖片中能夠看到每一個函數的調用關係以及每一個函數消耗的時間比例。