用google-perftool分析程序的內存/CPU使用

jopen 12年前發布 | 40K 次閱讀 分析程序 性能測試和優化

      最近,用到了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的使用,總體上來講有以下三種方式: