Linux进程通过中的malloc内存分配函数从系统获取内存标准C库,但在它真正-真正与内核交互之前,实际上还有另一层,那就是内存分配管理器(memoryallocator)。 常见的内存分配包括:ptmalloc (Glibc)、tcmalloc (Google)、jemalloc (FreeBSD)。 MySQL默认使用glibc的ptmalloc作为内存分配器。
内存累加器采用内存池管理方式,位于用户程序层和内核层之间,响应用户分配请求并向系统操作请求内存。然后返回到用户程序。
为了保持高效的分配,分配器通常会先从操作系统中使用一块内存,当用户程序申请和释放内存时,分配器会管理该内存并使用多种策略算法来决定是否使用。将其返回到操作系统。 这样做最大的好处就是可以避免用户程序频繁调用系统进行内存分配,使得用户程序对内存的使用更加高效、快捷。
我个人对ptmalloc内存分配的原理不太了解,所以这里就不详细解释了,有兴趣的同学可以阅读《glibc ptmalloc内存管理源码分析》。
关于如何选择这三个内存分配器,网上大多数信息都建议保留glibc原生的ptmalloc,而使用jemalloc或tcmalloc作为默认分配器。 因为ptmalloc的主要问题实际上是内存浪费、内存碎片以及加锁带来的性能问题,而jemalloc和tcmalloc则针对内存碎片和多线程处理进行了更多的优化。
目前 jemalloc 用于 Firefox、FaceBook 等,是 MariaDB、Redis 和 Tengine 推荐的默认内存分配器,而 tcmalloc 用于 WebKit、Chrome、 ETC。
上一篇:mysql数据库占用内存太大
下一篇:解决mysql服务内存占用过高