from:http://wangkaisino.blog.163.com/blog/static/1870444202011431112323846/


今年年初由于facebook而火起來(lái)jemalloc人之,但殊不知,malloc界里面很早就出名了。Jemalloc創(chuàng)始人Jason Evans也是在FreeBSD很有名的開(kāi)發(fā)。此人就在2006提高低性能的malloc寫(xiě)jemallocJemalloc2007開(kāi)始以FreeBSD標(biāo)準(zhǔn)引進(jìn)來(lái)的。件技術(shù)革新很多是FreeBSD發(fā)起的。在FreeBSD應(yīng)用廣泛的技術(shù)會(huì)慢慢導(dǎo)入到linux

目前jemallocfirefox中也在使用。在firefox2中出現(xiàn)內(nèi)存碎片問(wèn)題之后,便在firefox3中使用了jemalloc。在safarichrome中使用的是googletcmalloc

Jemalloc的技術(shù)特性

Jemalloc聚集了malloc的使用過(guò)程中所驗(yàn)證的很多技術(shù)。忽略細(xì)節(jié)構(gòu)著眼,最出色的部分仍是arenathread cache。(事實(shí)上,這兩個(gè)與tcmalloc的架構(gòu)幾乎相同。Jemalloc only的部分將會(huì)在另一次posting繼續(xù)

Arena

其像malloc集中管理一整塊內(nèi)存,不如其分成個(gè)塊來(lái)分而治之。此小便稱為arena想象一下,個(gè)小朋友一圖紙們隨意地畫(huà)點(diǎn)。結(jié)果可想而知,他肯定相互對(duì)方而不敢肆意地畫(huà)synchronization),而影響畫(huà)圖效率。但是如果老事先在大圖紙分好每個(gè)人的區(qū)域,小朋友就可以又快又準(zhǔn)地在各自地領(lǐng)域上畫(huà)圖這樣念就是arena

Thread cache

如果是開(kāi)辟小塊內(nèi)存,使不arena而直接malloc各自的thread cache領(lǐng)域。此ideagoogletcmalloc的核心部分,亦在jemalloc中體現(xiàn)

再拿上面的例子,小朋友除了一圖紙外,再各自A4這樣,小朋友在不畫(huà)大面的點(diǎn)時(shí),只在自己的A4上心情地畫(huà)即可(no arena seeking)。可以在自己手上的畫(huà)或涂(using thread cache),完全不用人(no synchronization, no locking),迅速有效地畫(huà)

jemalloc的核心layout。看著復(fù)雜,其實(shí)都是上面說(shuō)明的部分。

更好的內(nèi)存管理-jemalloc - Alex - wangkaisino的博客
 

實(shí)際jemalloc的性能呢?

更好的內(nèi)存管理-jemalloc - Alex - wangkaisino的博客
 

最左的就是glibcmalloc,最右的就是jemalloc從圖表上可以看出,jemalloc的性能有glibc倍以上。非常倒性的性能差。因此,使用了jemalloc應(yīng)用程序自然會(huì)快很多。Jemalloc的就是tcmallocTcmalloc的性能其相差甚微,低jemalloc2.1.04.5%上和tcmalloc1.4版本,而如今經(jīng)到了1.6版本,因此實(shí)際這兩應(yīng)該是不相仲伯的。Jemalloc創(chuàng)始人jason evans也意識(shí)一點(diǎn),說(shuō)cpu core 8以上的計(jì)算機(jī)上jemalloc效率更高。

程序的最后的免費(fèi)午餐 – kth分布式技術(shù)lab實(shí)      

2005發(fā)表了一篇文章免費(fèi)午餐的時(shí)代結(jié)束了在之前,程序就算不用費(fèi)腦子,cpu時(shí)鐘速度增加,程序性能自己就會(huì)上去。但現(xiàn)在不同,現(xiàn)cpu時(shí)鐘趨穩(wěn)定,而核數(shù)地增加。程序需要適應(yīng)這樣的多程多進(jìn)程的環(huán)境,開(kāi)發(fā)出適合的程序。文章的大這樣內(nèi)容。

6年之后的如今,篇文章完全現(xiàn)實(shí)了。事實(shí)cpu時(shí)鐘停留在3GHz,而核不上升。現(xiàn)在程序要適應(yīng)程多進(jìn)程的分布式計(jì)算,速度才能上升。但是這樣的程序很

現(xiàn)在在多程的環(huán)境下,程序員們的最后一道午餐便是tcmallocjemalloc這樣malloc library對(duì)于使用多程的程序而言,性能會(huì)提高數(shù)%

共享一下我本人的經(jīng)驗(yàn)。我本人在kth術(shù)研究所分布式技術(shù)lab中承擔(dān)iLock(分布式同步工具,請(qǐng)參googlechubby)。在iLock中用了googletcmalloc結(jié)果,性能提升了18~22%

最大的優(yōu)點(diǎn)就是不需要做任何復(fù)雜的工作便可得到這樣的效果。不需要代編譯。只需在執(zhí)行二進(jìn)制之前,在cmd窗口中

$ LD_PRELOAD=tcmalloc所設(shè)置的文件夾/libtcmalloc.so

這樣在之后執(zhí)行的應(yīng)用程序會(huì)使用tcmallocjemalloc而代替glibc標(biāo)準(zhǔn)mallocptmalloc)。設(shè)置此,我便可得到性能20%的提升,這真是送的最后的免費(fèi)午餐。

如今,在分布式技術(shù)lab中使用googletcmalloc。原因在于性能上者差不多,但googletcmalloc所提供的程序分析工具非常(heap profiler, cpu profiler)豐富。所以tcmalloc可能更方便一些。

一定要使用最新的malloc?一定要的!