内存分配器管理与mysql

103 阅读2分钟

linux的内存管理模块

关于Linux的内存分配管理模块,主要有三种:

  1. ptmalloc(glibc的malloc)是Linux提供的内存分配管理模块,MySQL默认使用系统的内存分配模块;

  2. tcmalloc是Google提供的内存分配管理模块;

  3. 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.配置读写分离,将读操作应用到从库,减少对主库的影响;