一、背景
数据库服务器内存告警,服务器的内存是512G,数据库innodb_buffer_pool_size分配了384G内存,随着时间推移,内存占用慢慢趋近于384G,而后开始使用服务器的交换空间(虚拟内存),跟服务器运维工程师沟通得知,这个虚拟内存实际是使用的磁盘空间,这样可能会影响到数据库服务的读写,所以开始研究分析,要如何解决。
二、方案选型
根据查阅相关资料,了解到MySQL默认是使用glibc作为内存分配器的,而市面上也有其他独立的内存分配器,如jemalloc、tcmalloc等。
jemalloc和tcmalloc的对比请参考:
内存分配器对比:jemalloc vs tcmalloc 的性能测试与选型_tcmalloc jemalloc对比-CSDN博客
三、jemalloc安装
1、下载地址:
2、解压安装包:
tar -jxvf jemalloc-5.3.0.tar.bz2
注:解压报错,执行:sudo yum -y install bzip2
3、编译安装:
./autogen.sh
make -j8
sudo make install
ldconfig
4、修改配置:
找到mysql安装路径,在bin目录下有一个mysqld_safe的文件,打开文件在顶部加上:
export LD_PRELOAD=/usr/local/lib/libjemalloc.so.2
# MySQL 安装根目录
basedir=/tools/mysql/mysql8
# 编辑mysqld_safe文件
vi /tools/mysql/mysql8/bin/mysqld_safe
# 加入以下内容
export LD_PRELOAD=/usr/local/lib/libjemalloc.so.2
# /usr/local/lib/libjemalloc.so.2 是jemalloc的默认路径
5、重启MySQL
sudo service mysql restart
四、验证
命令:
sudo lsof -p `pidof mysqld` | grep -i jemalloc
结果:
如果有指向jemalloc默认路径的记录,则说明mysql有成功使用jemalloc作为内存分配器,如果没有记录,则需要排查。