发现使用MySQL 5.X时,即使空闲也不会释放内存,只要将在my.cnf中设置了使用最大的内存值后,MySQL运行一段时间后就会无限接近最大值,而且会一直保持,即使空闲也不会自动释放,通过阅读博文https://www.cnblogs.com/coygfly/p/17513152.html后发现博主总结了以下方法。
总结一下MySQL内存使用率高且不释放的应对方法:
1. 扩内存,有钱任性(即使扩展,如果设置MySQL的最大使用内存值过大,运行时间长了,所占的内存仍然会无限接近最大值,而且会一直保持);
2. 在重启数据库释放内存(影响网站访问);
3. 在线修改减小innodb_buffer_pool_size参数(牺牲一定innodb性能,无法更有效地利用硬件资源);
4. 排查消耗内存的慢SQL,及时优化(经常排查,需手动释放,费时费力);
5. 检查相关buffer的session参数是否设置合理,比如read_rnd_buffer_size是否设置过大;
6. 使用gdb回收内存碎片:gdb --batch --pid ‘pidof mysqld’ --ex 'call malloc_trim(0)' (不是好方法,生产环境谨慎操作);
7. 对MySQL进程配置jemalloc内存管理模块(本文优选方法);
8. 配置读写分离,将读操作应用到从库,减少对主库的影响;
问题又来了,只安装了不优化设置也是不起作用的,后来结合参考博文:https://www.cnblogs.com/Lifehacker/p/jemalloc_settings.html 的方法,问题得到解决。
本文以Debian服务器为例:
1. 确认你的系统是否安装了jemalloc模块:
1 |
ldconfig -p | grep jemalloc |
如果没有,那么可能你的系统并未安装,又或者未设置jemallocr所在目录的环境变量,例如你可以使用以下命令来搜索jemalloc模块文件和命令所在的位置:
1 2 |
sudo find / -name "libjemalloc.so*" sudo find / -name "jemalloc-config" |
2. 查看对应的版本:
1 |
/usr/local/bin/jemalloc-config --version |
3. 如果版本太低,又或者未安装,请使用以下方命令进行安装或升级:
1 2 3 4 5 6 |
wget https://github.com/jemalloc/jemalloc/releases/download/5.3.0/jemalloc-5.3.0.tar.bz2 tar -xvf jemalloc-5.3.0.tar.bz2 cd jemalloc-5.3.0 ./autogen.sh make sudo make install |
4. 再次执行第1步命令验证安装了jemalloc模块:
1 |
ldconfig -p | grep jemalloc |
如果出现以下信息,表示已经安装成功:
libjemalloc.so.2 (libc6,x86-64) => /usr/local/lib/libjemalloc.so.2
libjemalloc.so (libc6,x86-64) => /usr/local/lib/libjemalloc.so
5. 通过以下命令查找到mysqld_safe文件的所在位置:
1 |
which mysqld_safe |
例如我服务器的mysqld_safe所在位置是/usr/bin/mysqld_safe
6. 编辑mysqld_safe文件:
1 |
sudo nano /usr/bin/mysqld_safe |
在文件配置的最前面添加以下内容:
# memory allocation
export LD_PRELOAD=/usr/local/lib/libjemalloc.so.2
export MALLOC_CONF="background_thread:true,dirty_decay_ms:10000,muzzy_decay_ms:10000"
参数说明:
background_thread:true
说明:启用后台线程后,jemalloc 会在后台异步回收空闲的内存,而不是在应用程序线程中进行。这可以减少内存分配和释放对应用程序性能的影响。
dirty_decay_ms:10000 (单位为毫秒)
说明:控制 "dirty" 页面(分配过但未使用的内存页)被回收的速度。
详细说明:
muzzy_decay_ms:10000 (单位为毫秒)
说明:控制 "muzzy" 页面(未使用且已重置的内存页)被回收的速度。
详细说明:
7. 执行重启mysql
1 |
sudo systemctl restart mysql |
8. 执行以下命令验证mysql进程是否使用了jemalloc模块:
1 |
lsof -p `pidof mysqld` | grep -i jemalloc |
如果出现以下内容,表示mysql正在使用jemalloc查块了。
mysqld 1556578 mysql mem REG 254,1 5592736 163304 /usr/local/lib/libjemalloc.so.2
声明: 本文由( 小天 )原创编译,转载请保留链接: Debian 12下为MySQL 5.7安装jemalloc优化内存的方法
------====== 本站公告 ======------
欢迎使用趣域网域名百科,我们将长期提供域名使用相关知识和投资域名的方法和技巧;并提供主机、服务器的解决问题和网站运营方法。