首先让我们来了解下什么是Jemalloc. Jemalloc源于Jason Evans 2006年在BSDcan conference发表的论文:《A Scalable Concurrent malloc Implementation for FreeBSD》。Jason认为phkmalloc 《FreeBSD’s previous malloc implementation by Kamp (1998)》中没有考虑多处理器的情况,因此在多线程并发下性会非常差,而Jemalloc则更适合多线程下内存分配管理。简单的说,Jemalloc是一种更适合工作在多处理器,多线程模型下的内存管理机制,并且从2007年开始作为FreeBSD标准。在FreeBSD广泛使用之后被引入到Linux中。目前Redis 2.4版本之后,默认使用jemalloc来做内存管理, 国内电商巨头淘宝奇侠的Tengine也整合Jemalloc作为默认的内存管理器。
先来一张Jemalloc的性能对比图,虽然有些老,但可见一斑:
那么如何让Nginx和MariaDB支持Jemalloc呢?其实很简单
1. 下载安装Jemalloc
Jemalloc下载地址: https://github.com/jemalloc/jemalloc/releases
a. 手动编译
tar xjf jemalloc-4.4.0.tar.bz2cd jemalloc-4.4.0 ./configuremake -j4 && make installecho '/usr/local/lib' > /etc/ld.so.conf.d/local.confldconfig
b. 从源安装(笔者用的archlinux很方便的可以使用最新的jemalloc-4.4.0)
pacman -Sy jemalloc
2. 让Nginx支持Jemalloc
想让Nginx支持Jemalloc需要在编译之前指定编译参数, 因此我们添加下面编译参数到configure中
--with-ld-opt="-ljemalloc"
我的编译参数如下, 成功编译之后即可让Nginx支持Jemalloc
./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_v2_module --with-http_ssl_module --with-ipv6 --with-http_gzip_static_module --with-http_realip_module --with-http_flv_module --with-http_mp4_module --with-openssl=../openssl-1.0.2j --with-pcre --with-pcre-jit --with-ld-opt='-ljemalloc'
3. 让Mariadb也支持Jemalloc
Mariadb对Jemalloc的支持非常好,可以通过两种方式来让Mariadb启用对Jemalloc的支持
a. 编译安装Mariadb时候增加configure参数
-DCMAKE_EXE_LINKER_FLAGS="-ljemalloc" -DWITH_SAFEMALLOC=OFF
b. 修改mysqld_safe文件,增加对Jemalloc的支持(对已经安装好的的Mariadb非常方便,笔者用的就是这种方法)
首先找到mysqld_safe的位置
[root@localhost ~]# whereis mysqld_safemysqld_safe: /usr/bin/mysqld_safe
然后添加一句(如下图,确保libjemalloc.so存在):
LD_PRELOAD=/usr/local/lib/libjemalloc.so
4. 如何判断Nginx和Mariadb已经启用了Jemalloc?
lsof可以帮助我们解决这个问题:
lsof -n | grep jemalloc