jemalloc如何工作? 有什么好处?

Firefox 3带有一个新的分配器: jemalloc

我在几个地方听说这个新的分配器更好。 Google的最佳search结果并没有提供任何进一步的信息,我对它的工作原理感兴趣。

jemalloc首先出现在FreeBSD上,这是一个“杰森·埃文斯”的心血结晶,因此也就是“je”。 我会嘲笑他是自负的,如果我没有写过一个名为paxos的操作系统:-)

完整的细节请参阅此PDF 。 这是一个白皮书,详细描述algorithm是如何工作的。

主要的好处是在多处理器和multithreading系统中实现了可扩展性,部分原因是通过使用多个场(从中分配的原始内存块)。

在单线程的情况下,对于多个赛场来说没有真正的好处,所以使用单个赛场。

然而,在multithreading情况下,创build了许多舞台(处理器数量是竞技场的四倍),线程以循环方式分配给这些舞台。

这意味着可以减lesslocking争用,因为在multithreading可能同时调用mallocfree ,它们只会在共享同一个竞技场的情况下进行竞争。 两个不同领域的线程不会相互影响。

另外, jemalloc试图优化caching局部性,因为从RAM中获取数据的行为比使用CPUcaching中的数据慢得多(概念上与从RAM快速获取和从磁盘慢速获取之间的区别没有什么不同)。 为此,它首先尝试最小化内存使用,因为这更有可能确保应用程序的整个工作集在caching中。

而且,在无法实现的地方,它试图确保分配是连续的,因为分配在一起的内存往往被一起使用。

从白皮书来看,这些策略似乎给当前单线程使用的最佳algorithm提供了类似的性能,同时为multithreading使用提供了改进。

有一个中间源:C源本身: http : //mxr.mozilla.org/mozilla-central/source/memory/mozjemalloc/jemalloc.c

在开始时,一个简短的总结描述了它是如何工作的。 但是,更深入的algorithm分析是不存在的。

至于什么好处jemalloc带到Mozilla,每个http://blog.pavlov.net/2008/03/11/firefox-3-memory-usage/ (也是第一个谷歌结果mozilla + jemalloc):

jemalloc在长时间运行后给了我们最less量的碎片 。 […]我们在Windows Vista上的自动化testing显示当我们打开jemalloc时,内存使用量下降了22%

2013年,Aerospike在一家私人部门实施了jemalloc。2014年,它被纳入Aerospike 3.3。 Psi Mankoski刚刚写了关于Aerospike的实现,以及何时以及如何有效使用jemalloc的高可扩展性 。

jemalloc确实帮助Aerospike利用现代multithreading,多CPU,多核计算机架构。 jemalloc还内置了一些非常重要的debuggingfunction来pipe理舞台。 debugging允许Psi能够告诉,例如,什么是真正的内存泄漏,而内存碎片的结果是什么。 Psi还讨论了线程caching和每线程分配如何提供整体性能(速度)改进。