1. 程式人生 > >用google-perftool分析程式的記憶體/CPU使用

用google-perftool分析程式的記憶體/CPU使用

    最近,用到了google-perftool分析程式的記憶體和CPU的使用情況,總結一下使用的一些方法和體會,分享給有需要的朋友。首先,說說google-perftool,它是由google開發的用來分析C/C++程式效能的一套工具,這裡的效能分析主要包括記憶體和CPU兩個方面,記憶體分析使用google-perftool所提供的tcmalloc,CPU分析使用它所提供的profiler。下面先分別介紹一下tcmalloc和profiler,然後再給出一些使用的例子,及一些使用時的注意事項。 1. tcmalloc

      tcmalloc的全稱是thread cache malloc,顧名思義,它是帶有thread cache的記憶體管理工具,具體的實現細節這裡不做過多的介紹,感興趣的朋友可以參考google官方提供的文件,或者閱讀原始碼。這裡需要註明一下tcmalloc的一些優點,和它所提供的一些分析程式記憶體使用的一些功能。
      tcmalloc的主要優點有兩個方面,一個是記憶體allocate/deallocate的速度,通常情況下它的速度比glibc所提供的malloc要快;另一個方面是小記憶體(< =32K)的管理,它的小記憶體是在thread cache裡面管理的,一方面減少了加鎖的開銷,另一方面用來表示小記憶體所用的額外的空間也比較小,比較節省空間。因此,對於多執行緒下,經常小記憶體的allocation/deallocation的程式(尤其多執行緒下使用STL比較多的程式),可以嘗試使用一下tcmalloc。
      除了在allocate/deallocate記憶體時的優化外,tcmalloc還提供了heapcheck和heapprofile的功能。heapcheck主要被用來檢查程式中是否有記憶體洩露,在哪裡洩露。相信記憶體洩露這個話題,永遠是讓所有C/C++程式都非常蛋疼的問題,有了tcmalloc的幫助,也許一切會變得簡單一些,會有點事半功倍的效果。tcmalloc另外一個功能是heapprofile。先來說一下profile這個詞,它的本意是“描繪…輪廓”,我一直覺得這個詞是一個很偉大的詞,用在sns中,它表示用來描繪使用者的那些特徵、屬性,也有叫使用者畫像的。用在這裡呢,heapprofile,顧名思義,它就是描繪程式的heap輪廓,通過這樣一個過程,我們就能知道,程式的heap裡在每一時刻都有些啥東東。有了profile的結果,它可以幫助我們定位記憶體洩露,幫助我們發現一些頻繁allocate記憶體的地方,以此來做一些優化。
      (關於程式中的heap和stack,不瞭解的朋友,可以到網上搜一下:程式的地址空間分佈)

2. profiler
      profiler,是由google-perftool所提供的用來做cpu-profile的工具,相信通過上面的介紹,大家對profile這個詞已經不再陌生。Cpu-profile,它的主要功能就是通過取樣的方式,給程式中cpu的使用情況進行“畫像”,通過它所輸出的結果,我們可以對程式中各個函式耗時情況一目瞭然。在對程式做效能優化的時候,這個是很重要的,先把最耗時的若干個操作優化好,程式的整體效能提升應該十分明顯,這也是做效能優化的一個最為基本的原則—先優化最耗時的。 3. 使用舉例

      關於google-perftool的使用,總體上來講有以下三種方式:

  • (1)直接呼叫提供的api:這種方式比較適用於對於程式的某個區域性來做分析的情況,直接在要做分析的區域性呼叫相關的api即可。
  • (2)連結靜態庫:這種方式是最為常用的方式,後面會有詳細的介紹。
  • (3)連結動態庫:這種方式和靜態庫的方式差不多,但通常不推薦使用,除非使用者不想額外鏈一個靜態庫(因為連結靜態庫會增大binary的大小)的情況,可以考慮使用這種方式。

      下面是靜態庫的使用方法:

  • (1)Heap Checker:
    1
    2
    
    gcc [...] -o myprogram -ltcmalloc
    env HEAPCHECK=normal ./myprogram
  • (2)Heap Profiler:
    1
    2
    
    gcc [...] -o myprogram -ltcmalloc
    env HEAPPROFILE=./myprogram.hprof ./myprogram
  • (3)Cpu Profiler:
    1
    2
    
    gcc [...] -o myprogram -lprofiler
    env CPUPROFILE=./myprogram.prof ./myprogram

      通過上面的方法,可以生成google-perftool原始的輸出結果。另外,google-perftoolg還提供了一個叫pprof的工具,它是一個perl的指令碼,通過這個工具,可以將google-perftool的輸出結果分析得更為直觀,輸出為圖片、pdf等格式。

      最後,補充一點,要用google-perftool來分析程式,必須保證程式能正常退出。所以,這裡也想多說幾句,我個人覺得,好的C/C++程式設計師,應該做到自己的程式都能優雅退出,這是最基本的要求。這裡所謂的優雅退出,指的是退出的時候把該釋放的資源釋放掉,且保證程式退出時不掛。