用google-perftool分析程序的內存/CPU使用
最近,用到了google-perftool分析程序的內存和CPU的使用情況,總結一下使用的一些方法和體會,分享給有需要的朋友。首先,說說google-perftool,它是由google開發的用來分析C/C++程序性能的一套工具,這里的性能分析主要包括內存和CPU 兩個方面,內存分析使用google-perftool所提供的tcmalloc,CPU分析使用它所提供的profiler。下面先分別介紹一下 tcmalloc和profiler,然后再給出一些使用的例子,及一些使用時的注意事項。
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,不了解的朋友,可以到網上搜一下:程序的地址空間分布)
profiler,是由google-perftool所提供的用來做cpu-profile的工具,相信通過上面的介紹,大家對 profile這個詞已經不再陌生。Cpu-profile,它的主要功能就是通過采樣的方式,給程序中cpu的使用情況進行“畫像”,通過它所輸出的結果,我們可以對程序中各個函數耗時情況一目了然。在對程序做性能優化的時候,這個是很重要的,先把最耗時的若干個操作優化好,程序的整體性能提升應該十分明顯,這也是做性能優化的一個最為基本的原則—先優化最耗時的。
關于google-perftool的使用,總體上來講有以下三種方式:
- (1)直接調用提供的api:這種方式比較適用于對于程序的某個局部來做分析的情況,直接在要做分析的局部調用相關的api即可。
- (2)鏈接靜態庫:這種方式是最為常用的方式,后面會有詳細的介紹。
- (3)鏈接動態庫:這種方式和靜態庫的方式差不多,但通常不推薦使用,除非使用者不想額外鏈一個靜態庫(因為鏈接靜態庫會增大binary的大小)的情況,可以考慮使用這種方式。 </ul>
- (1)Heap Checker:
- (2)Heap Profiler:
- (3)Cpu Profiler:
下面是靜態庫的使用方法:
1 2 |
gcc [...] -o myprogram -ltcmalloc env HEAPCHECK=normal ./myprogram |
</tr>
</tbody>
</table>
</div>
1 2 |
gcc [...] -o myprogram -ltcmalloc env HEAPPROFILE=./myprogram.hprof ./myprogram |
</tr>
</tbody>
</table>
</div>
1 2 |
gcc [...] -o myprogram -lprofiler env CPUPROFILE=./myprogram.prof ./myprogram |
</tr>
</tbody>
</table>
</div>
</ul>