通过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. 手动编译

b. 从源安装(笔者用的archlinux很方便的可以使用最新的jemalloc-4.4.0)

pacman_jemalloc

pacman_jemalloc

2. 让Nginx支持Jemalloc
想让Nginx支持Jemalloc需要在编译之前指定编译参数, 因此我们添加下面编译参数到configure中

我的编译参数如下, 成功编译之后即可让Nginx支持Jemalloc

3. 让Mariadb也支持Jemalloc
Mariadb对Jemalloc的支持非常好,可以通过两种方式来让Mariadb启用对Jemalloc的支持

a. 编译安装Mariadb时候增加configure参数

b. 修改mysqld_safe文件,增加对Jemalloc的支持(对已经安装好的的Mariadb非常方便,笔者用的就是这种方法)
首先找到mysqld_safe的位置

然后添加一句(如下图,确保libjemalloc.so存在):

mariadb_jemalloc

mariadb_jemalloc

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

lsof_jemalloc

lsof_jemalloc

Leave a Reply