谷歌開源 TCMalloc,專為 C 和 C++ 定制的內存分配器
谷歌表示,其 TCMalloc 可以代替 C 和 C++ 默認內存分配器,提供更高的擴展效率和更好的并行性支持。
為了避免誤解,值得注意的是,這實際上是谷歌第二次開源其內存分配器。事實上,谷歌在 2005 年就已經提供了其內存分配器,當時是作為谷歌性能工具的一部分連同其他工具一起推出的,其中包括內存分析器、旨在確保堆一致性的堆檢查器以及基于 Perl 的 ppro 配置分析器和可視化工具。盡管有這么回事,但是,谷歌使用的內部版本隨著時間的推移與外部版本出現了差異,因此,現在谷歌開源了 TCMalloc 的當前版本,其包括一些改進,如每個 CPU 緩存、一定規模大小的刪除、快 / 慢路徑改進,等等。
該倉庫是谷歌目前 TCMalloc 的實現,我們在生產中的所有 C++ 程序都在使用它。該代碼僅限于內存分配器實現本身。
如前所述,TCMalloc 包括 C*alloc 族和針對 C++ 的::operator new 以及::operator delete 的實現。與 C 和 C++ 標準庫提供的相應功能相比,它們提供了大量優化。例如,TCMalloc 利用固定大小的“頁”從操作系統執行分配任務,從而簡化了簿記過程。此外,其中一些頁面專門用于特定大小的對象,如所有 16 字節的對象。在需要獲取或釋放內存的時候,這還帶來了簡化。最后,它還會緩存常用對象以提高操作速度。
TCMalloc 還通過 MallocExtension 支持遙測擴展,這對于收集堆探查結果和快照以調查內存行為很有用。
有一些配置選項可用來調試 TCMalloc 性能。特別是,我們可以定義邏輯頁面大小,它們可以是 4KiB、8KiB、32KiB 或 256KiB。更大的頁面將減少從操作系統請求新頁面分配的可能性,從而以更大的內存消耗為代價實現更快的操作。它還可以基于每個線程或每個 CPU 來設置緩存大小,這是默認設置。最后,我們可以調整內存釋放的積極程度,這也會在幾個方面影響性能。
TCMalloc 架構如下圖所示,在相關文檔中有詳細的描述:
https://github.com/google/tcmalloc/blob/master/docs/design.md
TCMalloc 只能使用谷歌內部構建系統 Bazel 來構建,對于一些使用其他構建系統的開發人員來說,這可能有點讓人感覺意外。但是對 macOS、Ubuntu、Fedora 和 Windows 來說都有二進制格式的 Bazel 可用,因此,這應該不會成為主要障礙。