用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,不瞭解的朋友,能夠到網上搜一下:程序的地址空間分佈)shell

  • 2. profiler
          profiler,是由google-perftool所提供的用來作cpu-profile的工具,相信經過上面的介紹,你們對profile這個詞已經再也不陌生。Cpu-profile,它的主要功能就是經過採樣的方式,給程序中cpu的使用狀況進行「畫像」,經過它所輸出的結果,咱們能夠對程序中各個函數耗時狀況一目瞭然。在對程序作性能優化的時候,這個是很重要的,先把最耗時的若干個操做優化好,程序的總體性能提高應該十分明顯,這也是作性能優化的一個最爲基本的原則—先優化最耗時的。

  • 3. 使用舉例
  •       關於google-perftool的使用,整體上來說有如下三種方式:api

    • (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++程序員,應該作到本身的程序都能優雅退出,這是最基本的要求。這裏所謂的優雅退出,指的是退出的時候把該釋放的資源釋放掉,且保證程序退出時不掛。app

    相關文章
    相關標籤/搜索