linux的内存管理模块
关于Linux的内存分配管理模块,主要有三种:
-
ptmalloc(glibc的malloc)是Linux提供的内存分配管理模块,MySQL默认使用系统的内存分配模块;
-
tcmalloc是Google提供的内存分配管理模块;
-
jemalloc是FreeBSD提供的内存分配管理模块;
mysql的内存分配器
mysql默认用ptmalloc
redis使用jemalloc
mysql官网推荐使用tcmalloc
MariaDB默认使用的内存分配器是ptmalloc(Glibc),而 jemalloc是MariaDB、Redis、Tengine等推荐的内存分配器。
ptmalloc与jemalloc对比
ptmalloc(Glibc)是GNU C库的默认内存分配器,具有稳定性和可靠性高的优点,同时也拥有很好的性能。另一方面,ptmalloc对于内存碎片的处理不够理想,可能会导致内存利用率降低。
jemalloc作为一款优秀的内存分配器,它的设计目标就是提供优秀的性能和扩展性,同时保证内存使用的公平性。相比ptmalloc,jemalloc的内存碎片更少,这可以提高内存的利用率。同时,jemalloc支持多线程,可以更好地利用多核CPU的性能。
使用jemalloc还是默认的ptmalloc,取决于具体的应用场景和需求。在需要处理大量并发小请求的场景下,jemalloc可以提高系统的响应速度和吞吐量。在需要处理大量内存分配和释放的场景下,jemalloc可以提供更好的性能和内存利用率。然而,对于稳定性要求非常高的系统,ptmalloc(Glibc)可能是一个更安全的选择。
适用场景:
jemalloc适用于,大量并发、请求小的场景;
ptmalloc适用于稳定性要求高的系统。
问题总结
总结一下MySQL内存使用率高且不释放的应对方法:
1.扩内存,有钱任性;
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.配置读写分离,将读操作应用到从库,减少对主库的影响;