我在使用cpu-profiler時,出了一點問題,這裡記錄一下。
tcmalloc能用作記憶體池,優化malloc和線程配置設定記憶體的效率。它是gperftools的一員,gperftools還提供了heap-checker,heap-profiler和cpu-profiler三個工具。
源碼下載下傳:
https://github.com/gperftools/gperftools
編譯完後就可以使用tcmalloc庫了:
-ltcmalloc
-ltcmalloc_minimal //不支援heap-profiler和heap-checker,隻需要記憶體池需要減少程序大小。
其用法參考源碼docs/目錄下的同名html檔案的使用說明即可。
問題:
根據cpuprofile.html的說明,cpu-profile的用法有三種:
- 無需修改程式,直接連結libtcmalloc_and_profile.so。運作前指明CPUPROFILE檔案路徑。程式結束後産生profile資料檔案。
- 可以用信号來觸發開始和結束監控。CPUPROFILESIGNAL=signo,signo不能被占用。
- 在程式裡調用ProfilerStart()和ProfilerStop(),來指定要監控的代碼段。
上面三種方式,最終都會産生profile檔案,然後通過pprof分析。
前兩種方式我沒試出來(沒有産生profile檔案),因為tcmalloc源碼中使用了單例對象來初始化和啟動profile routine,由于程式沒有顯式調用tcmalloc的接口,所有libtcmalloc_and_profile.so并不會被加載,是以這個對象沒有被初始化。
解決方法可以改改源碼,主動調用庫中的一個函數,或者參考heapprofile的實作方式,在ctor/dtor中調用ProfilerStart()和ProfilerStop()。