今年年初因爲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麼?必定要的!