11

谷歌开源 TCMalloc,专为 C 和 C++ 定制的内存分配器

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzIzNjUxMzk2NQ%3D%3D&%3Bmid=2247493422&%3Bidx=2&%3Bsn=4d3621a3acc3f23d9f0a1f7d2ace4883
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

YZFBBbm.jpg!web

作者 | Sergio De Simone

谷歌表示,其 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 架构如下图所示,在相关文档中有详细的描述:

Eve2Ez3.jpg!web

https://github.com/google/tcmalloc/blob/master/docs/design.md

TCMalloc 只能使用谷歌内部构建系统 Bazel 来构建,对于一些使用其他构建系统的开发人员来说,这可能有点让人感觉意外。但是对 macOS、Ubuntu、Fedora 和 Windows 来说都有二进制格式的 Bazel 可用,因此,这应该不会成为主要障碍。

参考链接

https://www.infoq.com/news/2020/02/google-tc-malloc-open-source/

点个在看少个 bug :point_down:


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK