天天看點

我要使用TcMalloc

TcMalloc(Thread-CachingMalloc)是google-perftools工具中的一個記憶體管理庫。TcMalloc在記憶體配置設定的效率和速度上要高很多,而且支援多線程,支援64位應用程式。

1,介紹和初步使用的文章

推薦一個跨平台記憶體配置設定器tcmalloc用在3D遊戲上

Gperftools中tcmalloc的簡介和使用

TcMalloc的介紹以及Windows下安裝使用

2,深度解析的文章

tcmalloc淺析

3,在VisualStudio中接入 libtcmalloc_minimal.dll 

第一步,把 libtcmalloc_minimal.dll 放在合适的目錄下(放在你的exe檔案旁邊)。

第二步,在你的工程檔案中,把 libtcmalloc_minimal.lib 所在的目錄路徑添加到包含路徑中,把 libtcmalloc_minimal.lib 添加到依賴項中。

第三步,在強制符号引用中加入:__tcmalloc,如下圖所示:

我要使用TcMalloc

第四步,重新編譯你的代碼。

4,當你的工程中使用了TcMalloc後,要記得關閉omit-frame-pointer優化(另一種稱呼是“幀指針省略”Frame Pointer Omission,縮寫為FPO)。如果啟用這種優化,會使得TcMalloc在運作中出錯。該優化是一種已經被淘汰的技術,在VisualStudio和GCC中都能夠使用該優化。

在VisualStudio中,該優化的開關選項在這裡:

我要使用TcMalloc

想了解該優化,可以閱讀下面的文章:

FPO -frame pointer omit

關于-fno-omit-frame-pointer與-fomit-frame-pointer

FPO

記一次tcmalloc配置設定記憶體引起的coredump

5,使用TcMalloc後,如果應用程式的CPU占用過高(尤其是伺服器程式),有可能是TcMalloc的線程緩沖區太小了,預設的緩沖區是32M,可以修改成128M看看能否解決問題。

這個問題,在TcMalloc的官方bug單中也有描述:

Description of problem:

TCMalloc supports changing the size of the thread cache through the environmental variable TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES. This variable was not honored with TCMalloc 2.1 due to a bug, and this was the version previously provided by the Ceph repos. RHEL 7.2 has picked up TCMalloc 2.4, and the thread cache bug is resolved in this version. Increasing the TCMalloc thread cache to 128M can improve performance 4-5x.It would be great to have a way of setting the TCMalloc thread cache to 128M, instead of the default 32M.

TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES 的值預設是32M,從2.4版本開始,使用者可以調整該值的大小。

當一個線程的緩沖區超過它的max_size之後,這個線程就要和其它線程競争Central Heap配置設定更大的緩沖;線程的緩沖區超過max_size,表明如果提高線程的緩沖區,線程将運作的更加有效率。但如果線程緩沖區太大,又會緻使大量對象閑置而浪費記憶體。

6,接入TcMalloc的過程非常簡單,隻需幾處修改就能夠使得TcMalloc在你的項目裡正常工作。這是因為TcMalloc通過API hook鈎子來實作了無縫替換原有的記憶體配置設定函數。這就意味着你的項目必須是 MD(多線程dll)或者 MDd(多線程dll調試)。

繼續閱讀