今年年初因为facebook而火起来的jemalloc广为人之,但却不知,它在malloc界里面很早就出名了。Jemalloc的创始人Jason Evans也是在FreeBSD颇有名的开发人员。此人就在2006年为提升低性能的malloc而写的jemalloc。Jemalloc是从2007年开始以FreeBSD标准引进来的。软件技术革新不少是FreeBSD发起的。在FreeBSD应用普遍的技术会慢慢导入到linux。 chrome
目前jemalloc在firefox中也在使用。在firefox2中出现了内存碎片问题以后,便在firefox3中使用了jemalloc。在safari和chrome中使用的是google的tcmalloc。 分布式
Jemalloc的技术特性 ide
Jemalloc汇集了malloc的使用过程中所验证的不少技术。忽略细节,从架构着眼,最出色的部分还是arena和thread cache。(事实上,这两个与tcmalloc的架构几乎相同。Jemalloc only的部分将会在另外一次posting中继续探讨。) 工具
Arena post
与其像malloc一样集中管理一整块内存,不如将其分红许多个小块来分而治之。此小块便称为arena。让我们想象一下,给几个小朋友一张大图纸,让他们随意地画点。结果可想而知,他们确定相互顾忌对方而不敢肆意地画(synchronization),从而影响画图效率。可是若是老师事先在大图纸上划分好每个人的区域,小朋友们就能够又快又准地在各自地领域上画图。这样的概念就是arena。 性能
Thread cache google
若是是开辟小块内存,为使不参照arena而直接malloc,给各自的线程thread cache领域。此idea是google的tcmalloc的核心部分,亦在jemalloc中体现。 idea
再拿上面的例子,这次给小朋友们除了一张大图纸外,再各自给A4纸一张。这样,小朋友们在不画大面积的点时,只在本身的A4纸上心情地画便可(no arena seeking)。能够在本身手上的纸上画或涂(using thread cache),彻底不用顾忌别人(no synchronization, no locking),迅速有效地画。 spa
下图是jemalloc的核心layout。看着复杂,其实都是上面说明的部分。
实际jemalloc的性能呢?
最左边的就是glibc的malloc,最右边的就是jemalloc。从图表上能够看出,jemalloc的性能有glibc的两倍以上。很是压倒性的性能差异。所以,使用了jemalloc的应用程序天然会快不少。Jemalloc旁边的就是tcmalloc。Tcmalloc的性能与其相差甚微,低jemalloc2.1.0慢4.5%。图上和tcmalloc的1.4版本,而现在它已经到了1.6版本,所以实际上这两者应该是不相仲伯的。Jemalloc的创始人jason evans也意识到这一点,说在cpu core 8以上的计算机上jemalloc效率更高。
给程序员的最后的免费午饭 – kth分布式技术lab的实例
2005年发表了一篇文章“免费午饭的时代结束了”。在以前,程序就算不用费脑子,随着cpu时钟速度增长,程序性能本身就会上去。但现在不一样,现在cpu时钟趋于稳定,而核数不断地增长。程序员须要适应这样的多线程多进程的环境,并要开发出适合的程序。文章讲的大概是这样的内容。
6年以后的现在,这篇文章彻底变成现实了。事实上cpu时钟停留在3GHz,而核不断上升。现在程序要适应多线程多进程的分布式计算,速度才能上升。可是这样的程序很难。
现在在多线程的环境下,给程序员们的最后一道午饭即是tcmalloc,jemalloc这样的malloc library。对于使用多线程的程序而言,性能会提升数十%。
共享一下我本人的经验。我本人在kth技术研究所分布式技术lab中承担iLock(分布式同步工具,请参考google的chubby)。在iLock中用了google的tcmalloc的结果,性能提高了18~22%。
最大的优点就是你不须要作任何复杂的工做即可获得这样的效果。不须要代码重编译。只需在执行二进制以前,在cmd窗口中输入
$ LD_PRELOAD=”tcmalloc所设置的文件夹/libtcmalloc.so”
这样在以后执行的应用程序会使用tcmalloc或jemalloc,从而代替glibc标准malloc(ptmalloc)。这需设置此处,我们即可获得性能20%的提高,这真可谓是送给我们的最后的免费午饭。
现在,在分布式技术lab中使用google的tcmalloc。缘由在于性能上两者差很少,但google的tcmalloc所提供的程序分析工具很是(heap profiler, cpu profiler)丰富。因此tcmalloc可能更方便一些。
必定要使用最新的malloc么?必定要的!