通过Jemalloc优化Nginx和MariaDB

首先让我们来了解下什么是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的性能对比图,虽然有些老,但可见一斑:

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
pacman_jemalloc
pacman_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
mariadb_jemalloc
mariadb_jemalloc

4. 如何判断Nginx和Mariadb已经启用了Jemalloc?
lsof可以帮助我们解决这个问题:

lsof -n | grep jemalloc
lsof_jemalloc
lsof_jemalloc
Scroll to Top