跳转到主要内容

MySQL 8.0 启用 Jemalloc

随便一搜你大概会找到这样的建议

#修改my.cnf文件 [mysqld_safe]配置区间加上Jemalloc选项
[mysqld_safe]
malloc-lib = /usr/lib64/libjemalloc.so

但这是给 MySQL 5.6 用的,从 MySQL 5.7 版本开始,已经默认不使用 mysqld_safe 来启动了。

#修改my.cnf文件 [mysqld_safe]配置区间,加上Jemalloc选项
[mysqld_safe]
malloc-lib = /usr/lib64/libjemalloc.so

所以这是行不通的。

虽然说是 Jemalloc,JemallocTCmalloc 等也是同理。


安装 Jemalloc

A. 手动安装

https://github.com/jemalloc/jemalloc/releases 下载并编译安装


B.使用包管理器

RHEL 系列可以在 EPEL 源中找到。


手动启动 MySQL

厄,你不应该手动启动 mysql,但你一定要的话

LD_PRELOAD=/usr/lib64/libjemalloc.so.2 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid --user mysql

LD_PRELOAD= 指向你的 Jemalloc 实际路径。
如 jemalloc 5.1.2 应该是 /usr/lib64/libjemalloc.so.2
或者 cat /usr/bin/jemalloc.shLD_PRELOAD=${libdir}/libjemalloc.so.2 这一行会告诉你实际路径。


使用 Systemd 启动 MySQL

在你的 mysql.serive(/usr/lib/systemd/system/mysqld.service) 中的 [Service] 部分添加:EnvironmentFile=-/etc/sysconfig/mysql

例如:

[Service]
User=mysql
Group=mysql
# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql
  • Systemd 中的 =- 表示:可选前缀“-”,表示如果文件不存在,则不会读取它,并且不会记录错误或警告消息。

然后新建 /etc/sysconfig/mysql 文件,在其中写写入:

LD_PRELOAD=/usr/lib64/libjemalloc.so.2

LD_PRELOAD= 指向你的 Jemalloc 实际路径。
如 jemalloc 5.1.2 应该是 /usr/lib64/libjemalloc.so.2
或者 cat /usr/bin/jemalloc.shLD_PRELOAD=${libdir}/libjemalloc.so.2 这一行会告诉你实际路径。


检查 MySQL 是否正在使用 Jemalloc

执行 lsof -Pn -p $(pidof mysqld) | grep jemalloc,有指向 /usr/local/lib/libjemalloc.so.2 则为成功。





主要参考