MySQL关于内存泄漏
现象&猜测原因最近发现新上的项目数据库服务器一直报可用内存不足,OS版本:Centos Linux release 7.6.1810,内核版本:3.10.0-957.el7.x86_64,MySQL版本:5.7.28&5.7.29。排查一圈应该是内存泄漏了。
加上前几日爱可生开源社区的关于内存泄漏的文章,和叶老板的支持,怀疑2个方面:1.P_S;2.table_open_cache
和table_definition_cache
设置的太小。
解决方案看了BUG库,大部分人都是采用tcmalloc或者jemalloc来解决这个问题,结合现在的systemd,总结解决方法如下yum -y install gcc make gcc-c++
## 1.下载&编译tcmalloc
wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.7.90/gperftools-2.7.90.tar.gz
tar xvf gperftools-2.7.90.tar.gz
cd gperftools-2.7.90/
./configure
make
makeinstall
find ! -path "/proc/*" -name libtcmalloc.so
/usr/local/lib/libtcmalloc.so
## 2.修改systemd文件
vim etc/systemd/system/mysqld_3306.service
EnvironmentFile=-/etc/sysconfig/mysql
## 3.编译好的libtcmalloc.so路径写入/etc/sysconfig/mysql
echo 'LD_PRELOAD=/usr/local/lib/libtcmalloc.so' > etc/sysconfig/mysql
## 4.重新reload systemd,重启MySQL
systemctl daemon-reload
systemctl restart mysqld_3306.service
## 5.验证生效
[root@xxx service]# lsof -n | grep tcmalloc
mysqld 106311 mysql mem REG 253,0 2582792 632947 usr/local/lib/libtcmalloc.so.4.5.4
mysqld 106311 106312 mysql mem REG 253,0 2582792 632947 usr/local/lib/libtcmalloc.so.4.5.4