一:jemalloc 简介
jemalloc 强调了碎片避免和可扩展的并发支持。jemalloc于2005年首次作为FreeBSD libc分配器使用,从那以后它已经进入许多依赖于其可预测行为的应用程序。jemalloc适合多线程下内存分配管理,jemalloc从各方评测的结果可见与google tcmalloc都不相伯仲,皆为内存管理器领域最高水平。有时候,我们想采用Jemalloc来替代glibc库的malloc内存管理方式,或者如果想启用TokuDB引擎,则就必须启用Jemalloc才行了。
二:安装 jemalloc
1. yum 安装 jemalloc
1) 安装
yum install jemalloc -y
yum install tcmalloc -y
2) 生效 LD_PRELOAD 环境变量
source /usr/bin/jemalloc.sh
env|grep LD_PRELOAD
2. 编译安装 jemalloc
1) 下载安装包
wget https://github.com/jemalloc/jemalloc/releases/download/5.1.0/jemalloc-5.1.0.tar.bz2
2)解压编译安装
tar jxvf jemalloc-5.1.0.tar.bz2
cd jemalloc-5.1.0
./configure --prefix=/usr
make && make install
##注意这里要指定编译路径,否则mysql启动的时候会报如下错误
mysqld_safe --malloc-lib must be located in one of the directories: /usr/lib /usr/lib64 /usr/lib/i386-linux-gnu /usr/lib/x86_64-linux-gnu
##反向操作
make uninstall && make clean
make -f dc_debug.mak clean
三:启动MySQL如何加载 Jemalloc
1. 通过指定 LD_PRELOAD 环境变量加载 jemalloc
1) 切换到 mysql 用户
su - mysql
2) 设置 LD_PRELOAD 环境变量
export LD_PRELOAD=/usr/lib64/libjemalloc.so.1
env|grep LD_PRELOAD
#LD_PRELOAD是个环境变量,用于动态库的加载,动态库加载的优先级最高。一般情况下,其加载顺序为:LD_PRELOAD>LD_LIBRARY_PATH => /etc/ld.so.cache => /lib => /usr/lib
3) mysqld 直接启动数据库
/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf &
或者
msyqld_safe --defaults-file=/etc/my.cnf &
4)确认 mysqld 是否加载了 jemalloc
lsof -p `pidof mysqld` | grep -i jemalloc
mysqld 8041 mysql mem REG 253,1 212096 51708144 /usr/lib64/libjemalloc.so.1
#命令有如上输出时表示加载成功
2. 通过在配置文件中指定 malloc-lib 参数加载 jemalloc
1) 配置文件中指定 malloc-lib 参数
vi /etc/my.cnf
[mysqld_safe]
malloc-lib = /usr/lib64/libjemalloc.so.1
#详细信息可以参考 https://dev.mysql.com/doc/refman/5.7/en/mysqld-safe.html#option_mysqld_safe_malloc-lib
2) 通过 mysqld_safe 启动数据库
mysqld_safe --defaults-file=/etc/my.cnf &
3)检查 jemalloc 是否加载成功
lsof -p `pidof mysqld` | grep -i jemalloc