用于C / C ++的多线程内存分配器

时间:2008-09-29 02:13:03

标签: c++ c memory malloc allocation

我目前拥有大量的多线程服务器应用程序,而且我正在四处寻找一个好的多线程内存分配器。

到目前为止,我被撕裂了:

  • Sun's umem
  • Google的tcmalloc
  • 英特尔的线程构建块分配器
  • Emery Berger的囤积

从我发现的东西可能是最快的,但我在今天之前没有听说过,所以我怀疑它是否真的像它看起来那么好。任何人都有尝试这些分配器的个人经验吗?

8 个答案:

答案 0 :(得分:17)

我使用过tcmalloc并阅读了Hoard。两者都有类似的实现,并且都相对于线程/ CPU的数量(根据各自站点上的图表)实现大致线性的性能扩展。

所以:如果性能确实非常重要,那么就进行性能/负载测试。否则,只需掷骰子并选择其中一个(在目标平台上通过易用性加权)。

trshiv's link开始,看起来Hoard,tcmalloc和ptmalloc的速度大致相当。总体而言,tt看起来像ptmalloc被优化为尽可能少的空间,Hoard优化了速度+内存使用的权衡,tcmalloc针对纯粹的速度进行了优化。

答案 1 :(得分:11)

真正告诉哪个内存分配器适合您的应用程序的唯一方法是尝试一些。提到的所有分配器都是由聪明的人写的,并且会在一个特定的微基准或其他微基准上击败其他分配器。如果你的所有应用程序一整天都在线程A中的malloc一个8字节块并在线程B中释放它,并且根本不需要处理其他任何东西,你可能会编写一个内存分配器来击败任何一个到目前为止列出的那些它对其他很多东西都没有用。 :)

我在工作中使用Hoard有一些经验(足以使最近3.8版本中解决的一个比较模糊的错误是由于这种经历而发现的)。这是一个非常好的分配器 - 但对你来说有多好,取决于你的工作量。你必须支付Hoard(虽然它不是太贵),以便在没有GPL代码的商业项目中使用它。

一个非常适应的ptmalloc2已经成为glibc malloc背后的分配器已经有一段时间了,因此它被广泛使用和测试。如果稳定性在所有事情上都很重要,那么它可能是一个不错的选择,但你没有在列表中提及它,所以我认为它已经完成了。对于某些工作负载来说,这很糟糕 - 但任何通用的malloc都是如此。

如果你愿意付钱(而且价格合理,根据我的经验),SmartHeap SMP也是一个不错的选择。提到的大多数其他分配器都设计为可以LD_PRELOAD'd的drop-in malloc / free new / delete替换。 SmartHeap也可以这种方式使用,但它还包括一个完整的分配相关API,可让您根据心脏内容微调分配器。在我们已经完成的测试中(同样,非常特定于特定应用程序),SmartHeap与作为插入式malloc替换时的性能大致相同;两者之间的真正区别在于定制程度。您可以获得更好的性能,而不需要分配器的通用目的。

根据您的使用情况,通用多线程分配器可能根本不是您想要使用的;如果你经常是malloc&免费提供大小相同的对象,您可能只想编写一个简单的slab分配器。在Linux内核中适合该描述的几个地方使用了平板分配。 (我会给你一些更有用的链接,但我是一个“新用户”,Stack Overflow已经决定不允许新用户在一个答案中有用.Google可以帮助但是,这还不错。)

答案 2 :(得分:5)

我个人更喜欢并推荐ptmalloc作为多线程分配器。 Hoard很好,但在几年前我的团队在Hoard和ptmalloc之间进行的评估中,ptmalloc更好。据我所知,ptmalloc已存在多年,并被广泛用作多线程分配器。

您可能会发现this comparison有用。

答案 3 :(得分:4)

也许这是接近你要求的错误方法,但也许可以采用不同的策略。如果你正在寻找一个真正快速的内存分配器,你应该问为什么你需要花费所有的时间来分配内存,而你可能只是逃避堆栈分配的变量。堆栈分配,虽然更烦人,做得正确可以节省你的互联网争用的方式,以及保持代码中的奇怪的内存损坏问题。此外,您可能会有更少的碎片,这可能有所帮助。

答案 4 :(得分:3)

我们在几年前工作过的项目中使用了囤积物。它看起来很棒。我没有其他分配器的经验。尝试不同的并进行负载测试应该很容易,不是吗?

答案 5 :(得分:3)

locklessinc分配器非常好,如果您有疑问,开发人员会做出响应。他写了一篇关于使用的一些优化技巧的文章,这是一篇有趣的读物:http://locklessinc.com/articles/allocator_tricks/。我过去使用过它,效果很好。

enter image description here

答案 6 :(得分:2)

可能是对您的问题的迟到回复,但

如果你有表演的话,为什么要做mallocs?

更好的方法是在初始化时执行大内存窗口的malloc,然后得到light weight Memory manager lease out the memory chunks at run time。{{1}}。

如果您的堆扩展,这可以避免系统调用的任何可能性。

答案 7 :(得分:2)

您可以尝试ltalloc(具有快速池分配器速度的通用全局内存分配器)。