jemalloc linux快速上手
jemalloc在linux上從安裝到使用
redis有用到jemalloc。
首先,jemalloc是幹什麼的? 我們看看作者自己的介紹:
jemalloc is a general purpose malloc(3) implementation that emphasizes fragmentation avoidance and scalable concurrency support
意思是說jemalloc幹了malloc乾的活,而且幹得好一些,主要體現在避免記憶體碎片與併發擴充套件上。
首先,什麼是記憶體碎片?
malloc/free或new/delete大量使用後回造成記憶體碎片,那麼這種碎片形成的機理是什麼? 如果機理是申請的記憶體空間大小(太小)所形成的,那麼,申請多大的區域能夠最大限度的避免記憶體碎片呢?(這裡的避免不是絕對的避免,只是一種概率) 記憶體碎片一般是由於空閒的連續空間比要申請的空間小,導致這些小記憶體塊不能被利用。產生記憶體碎片的方法很簡單,舉個例: 假設有一塊一共有100個單位的連續空閒記憶體空間,範圍是0~99。如果你從中申請一塊記憶體,如10個單位,那麼申請出來的記憶體塊就為0~9區間。這時候你繼續申請一塊記憶體,比如說5個單位大,第二塊得到的記憶體塊就應該為10~14區間。 如果你把第一塊記憶體塊釋放,然後再申請一塊大於10個單位的記憶體塊,比如說20個單位。因為剛被釋放的記憶體塊不能滿足新的請求,所以只能從15開始分配出20個單位的記憶體塊。 現在整個記憶體空間的狀態是0~9空閒,10~14被佔用,15~24被佔用,25~99空閒。其中0~9就是一個記憶體碎片了。如果10~14一直被佔用,而以後申請的空間都大於10個單位,那麼0~9就永遠用不上了,造成記憶體浪費。 如果你每次申請記憶體的大小,都比前一次釋放的內村大小要小,那麼就申請就總能成功。
記憶體碎片很可怕嗎? 短時間內不明顯,對於線上的伺服器比如nginx,執行時間可能經年,每天幾億的請求量,如果每天產生100片 ,一年下來也是3萬多片 ,相當恐怖!
jemalloc可以有效的解決這個問題! jemalloc的效能圖(上篇已經展示過):
既然jemalloc這麼牛逼,我們就來安裝吧!
下載到linux目錄下解壓:
tar -xjvf jemalloc-4.2.1.tar.bz2 生成的檔案列表如下:
在此目錄下預編譯
./configure –prefix=/usr/local/jemalloc
完成後再編譯:
make -j8 && make install
我們到生成目錄去看看:
生成的標頭檔案在include裡,庫在lib裡。
至此,安裝算是完成了。
下面看看如何使用: 在編譯連結時直接指向jemalloc即可:
gcc -g -c -o 1.o 1.c gcc -g -o 1.out 1.o -L/usr/local/jemalloc/lib -ljemalloc
執行程式時可能會報找不到庫:
只要將jemalloc的庫被系統找到即可:
echo /usr/local/jemalloc/lib >> /etc/ld.so.conf ldconfig
再次執行即可