1. 背景
我们在日常运维工作中,发现测试环境的mysql服务端偶尔出现内存使用率非常高的情况。
系统中查看mysqld已用内存量远远超出了innodb_buffer_pool_size配置的数倍之多。
另外在问题发生时,查看mysqld中的连接数仅500多,且大部分连接为sleep状态。
也就是说,虽然系统分配了大量的内存给mysqld,但其实际上并不需要用到那么多内存,内存可能产生了碎片,内存没有及时GC。
所以,尝试将mysqld的内存管理器改为使用 jemalloc 来提升内存效能。
jemalloc 是由Jason Evans 在FreeBSD 项目中引入的新一代内存分配器。
它是一个通用的malloc 实现,侧重于减少内存碎片和提升高并发场景下内存的分配效率,其目标是能够替代malloc。
redis目前默认使用的内存管理器就是 jemalloc 。
2. 安装依赖包
编译安装jemalloc需要用到以下软件需要事先安装,使用以下命令安装
[root@localhost ~]# yum install -y gcc autoconf
安装pt-mysql-summary工具。
该项目为可选安装,仅用于确认mysqld是否成功加载jemalloc动态库。即使不安装也不影响服务。
# 添加 percona yum源
[root@localhost ~]#yum install -y https://downloads.percona.com/downloads/percona-release/percona-release-1.0-9/redhat/percona-release-1.0-9.noarch.rpm
# 刷新yum源缓存
[root@localhost ~]# yum makecache
# 安装依赖项mysql-community-libs-compat
[root@localhost ~]# yum install mysql-community-libs-compat -y
# pt-mysql-summary工具包含在percona-toolkit包中
[root@localhost ~]# yum install percona-toolkit -y
3. 安装jemalloc
从jemalloc官方的github项目下载源码:github.com/jemalloc/je…
本文以jemalloc版本5.3.0,操作系统Centos7.9为例。
将下载后的源码包,上传到mysql服务器中。
然后对源码包解压缩、编译、安装
# 解压缩
[root@localhost ~]# unzip jemalloc-5.3.0
# 进入目录
[root@localhost ~]# cd jemalloc-5.3.0
# 编译安装
# lib最好放在 /usr/lib64 中,不然可能会出现mysql识别不到库的情况
[root@localhost jemalloc-5.3.0]# bash autogen.sh --prefix=/usr/local/jemalloc --libdir=/usr/lib64
# 如无报错则继续往下执行
[root@localhost jemalloc-5.3.0]# make
[root@localhost jemalloc-5.3.0]# make install
[root@localhost jemalloc-5.3.0]# ldconfig
确认安装
# 如果该命令返回了结果,则代表安装成功。无返回结果则代表没安装成功。
[root@localhost ~]# ldconfig -p |grep jemalloc
4. 为mysql启用jemalloc内存管理器
如果当mysql进程使用systemd管理的话,按照以下方法修改。
# 默认情况下 mysqld.service 文件中应当存在以下内容
# 如果不存在,则按照下面的例子手动增加一行
[root@localhost jemalloc-5.3.0]# grep EnvironmentFile /usr/lib/systemd/system/mysqld.service
EnvironmentFile=-/etc/sysconfig/mysql
# 手动创建 /etc/sysconfig/mysql 文件,原本该文件不存在
[root@localhost jemalloc-5.3.0]# echo "LD_PRELOAD=libjemalloc.so" >>/etc/sysconfig/mysql
# 修改完成后重启 mysqld
[root@localhost jemalloc-5.3.0]# systemctl restart mysqld
如果mysql是编译安装的话,按照以下方法修改
# 编译安装的mysql在启动命令前加上变量 LD_PRELOAD 即可
LD_PRELOAD=/usr/lib64/libjemalloc.so.1 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid --user mysql
5. 验证
# 使用 pt-mysql-summary 工具验证mysql的内存管理器是否成功修改为 jemalloc
# 开启之前
[root@localhost ~]# pt-mysql-summary --password=1qaz@WSX | grep -A5 -i "memory management"
# Memory management library ##################################
jemalloc is not enabled in mysql config for process with id 9180
# The End ####################################################
# 开启成功
[root@localhost jemalloc-5.3.0]# pt-mysql-summary --password=1qaz@WSX | grep -A5 -i "memory management"
# Memory management library ##################################
jemalloc enabled in mysql config for process with id 22390
Using jemalloc from /usr/lib64/libjemalloc.so.2
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




