更好的内存管理jemalloc

Posted by Sunday on 2017-12-25

1. jemalloc是干什么的呢?

官方说明:

jemalloc is a general purpose malloc(3) implementation that emphasizes fragmentation avoidance and scalable concurrency support.
jemalloc干了malloc干的活,而且干得好一些,主要体现在避免内存碎片与并发扩展上

2. jemalloc安装

1
2
3
4
5
wget https://github.com/jemalloc/jemalloc/releases/download/4.4.0/jemalloc-4.4.0.tar.bz2
tar jxvf jemalloc-4.4.0.tar.bz2
cd jemalloc-4.4.0/
./configure --prefix=/usr/local/webserver/jemalloc
make && make install
1
2
3
echo '/usr/local/webserver/jemalloc/lib' > /etc/ld.so.conf.d/local.conf
/sbin/ldconfig #更新ld
/sbin/ldconfig -p | grep jemalloc #查询更新后的ld

3. 使用jemalloc优化Nginx

编译NGINX时添加以下参数:
–with-ld-opt=/usr/local/webserver/jemalloc/lib/libjemalloc.so.2
具体实现:

1
2
3
4
5
cd nginx-1.12.1
make clean
./configure --prefix=/usr/local/webserver/nginx
--with-ld-opt="/usr/local/webserver/jemalloc/lib/libjemalloc.so.2"
make && make install

4. 使用jemalloc优化MySQL

方法1.
MySQL/MaridDB 5.5编译方法,cmake预编译时加上下面参数

1
2
-DCMAKE_EXE_LINKER_FLAGS="-ljemalloc" -DWITH_SAFEMALLOC=OFF
load_jemalloc=1

方法2.
修改mysqld_safe直接加载:
查找文件 /usr/local/mysql/bin/mysqld_safe
在#executing mysqld_safe 下面加上

1
mysqld_ld_preload=/usr/local/webserver/jemalloc/lib/libjemalloc.so     #Percona Mysql

重新启动MYSQL

1
systemctl restart mysql

使用下面代码自动修改mysqld_safe文件

1
2
sed -i 's@executing mysqld_safe@executing mysqld_safe\nexport LD_PRELOAD=/usr/local/webserver/jemalloc/lib/libjemalloc.so@' /usr/local/webserver/mysql/bin/mysqld_safe
load_jemalloc=1

5. 验证 jemalloc 是否运行

1
lsof -n | grep jemalloc