jemalloc 記憶體分配管理

2021-09-20 22:51:45 字數 1625 閱讀 1288

今天在安裝mariadb的時候發現編譯一直提示乙個錯誤/usr/bin/ld: cannot find -ljemalloc_pic

後來發現是因為沒有用這個jemalloc 可能是mariadb資料庫預設就使用這種方式管理多執行緒記憶體分配

一、首先這個jemalloc是什麼

jemalloc源於jason evans 2023年在bsdcan conference發表的**:《a scalable concurrent malloc implementation for freebsd》。 jason認為phkmalloc(freebsd』s previous malloc implementation by kamp (1998))沒有考慮多處理器的情況,因此在多執行緒併發下效能低下(事實如此),而jemalloc適合多執行緒下記憶體分配管理。從2023年開始以 freebsd標準引進來。軟體技術革新很多是freebsd發起,在freebsd應用廣泛的技術會慢慢匯入到linux

中。redis 2.4版本之後,預設使用jemalloc來做記憶體管理;tengine也整合jemalloc。jemalloc從各方評測的結果可見與google tcmalloc都不相伯仲,皆為記憶體管理器領域最高水平。如下圖:

最 左邊的就是glibc的malloc,最右邊的就是jemalloc。從圖表上可以看出,jemalloc的效能有glibc的兩倍以上。非常壓倒性的性 能差異。因此,使用了jemalloc的應用程式自然會快很多。jemalloc旁邊的就是tcmalloc。tcmalloc的效能與其相差甚微,低 jemalloc2.1.0慢4.5%。圖上和tcmalloc的1.4版本,而現在已經到2.1版本,因此實際上這兩者應該是不相仲伯的。 jemalloc的創始人jason evans也意識到這一點,說在cpu core 8以上的計算機上jemalloc效率更高

二、使用

安裝jemalloc

cd lnmp/src

wget 

tar xjf jemalloc-3.4.0.tar.bz2

cd jemalloc-3.4.0./configure

make && make install

echo '/usr/local/lib' > /etc/ld.so.conf.d/local.conf

ldconfig

使用jemalloc優化mysqlmysql/mariddb 5.5編譯方法,cmake預編譯時加上下面引數

-dcmake_exe_linker_flags="-ljemalloc" -dwith_safemalloc=off
或者直接載入,修改mysqld_safe

sed -i 's@executing mysqld_safe@executing mysqld_safe\nexport ld_preload=/usr/local/lib/libjemalloc.so@' /usr/local/mysql/bin/mysqld_safe

service mysqld restart

三、驗證是否生效

lsof -n | grep jemalloc

更好的記憶體管理 jemalloc

jemalloc的創始人jason evans也是在freebsd很有名的開發人員。此人就在2006年為提高低效能的malloc而寫的jemalloc。jemalloc是從2007年開始以freebsd標準引進來的。軟體技術革新很多是freebsd發起的。在freebsd應用廣泛的技術會慢慢匯入到l...

記憶體分配管理

系統中的記憶體分為棧 堆 全域性區 區 棧 由編譯器自動分配釋放,參訪函式的引數值,區域性變數,函式棧幀,函式呼叫過程。堆 由程式設計師自行分配想要的空間大小,c中的malloc等函式,c 中的new 全域性區 資料區 存放的是全域性變數和靜態變數,初始化的存在一起,未初始化的放一起,程式結束後由系...

記憶體分配 Go記憶體管理 記憶體分配一

go作為乙個比較新晚 新 的語言,自然借鑑前輩們的優點,比如說語言本身負責記憶體管理 對協程和高併發的高優支援 簡單高效的語法等。本篇及後續的幾篇要講的就是還沒提到的比較複雜的記憶體管理。學習記憶體管理 分配 前,如果有jvm的記憶體管理的基礎,會變得非常簡單,如果是第一次接觸記憶體管理,在看完go...