天天看點

tcmalloc的使用問題

我在使用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的用法有三種:

  1. 無需修改程式,直接連結libtcmalloc_and_profile.so。運作前指明CPUPROFILE檔案路徑。程式結束後産生profile資料檔案。
  2. 可以用信号來觸發開始和結束監控。CPUPROFILESIGNAL=signo,signo不能被占用。
  3. 在程式裡調用ProfilerStart()和ProfilerStop(),來指定要監控的代碼段。

上面三種方式,最終都會産生profile檔案,然後通過pprof分析。

前兩種方式我沒試出來(沒有産生profile檔案),因為tcmalloc源碼中使用了單例對象來初始化和啟動profile routine,由于程式沒有顯式調用tcmalloc的接口,所有libtcmalloc_and_profile.so并不會被加載,是以這個對象沒有被初始化。

解決方法可以改改源碼,主動調用庫中的一個函數,或者參考heapprofile的實作方式,在ctor/dtor中調用ProfilerStart()和ProfilerStop()。