一、 MYSQL的内存分配问题
1、 MYSQL内存分配函数调用栈
从代码就可以看到,INNODB要分配和释放内存的时候,并没有直接调用MALLOC和FREE,而是调用经过封装的函数
My_alloc.c::alloc_root
2、 相关的参数
可以看到的是,这两个参数从MYSQL5.6开始就已经废弃了,MYSQL5.7更加直接删除了,我从MARIADB10.0.21(相当于MYSQL5.6)的代码中找到的内容也证实了这一点
二、 分析
1、 MYSQL是否有自己独立的内存管理
准确的答案是,曾经有过,但现在已经没有了,完全用操作系统的ALLOCATOR了。
为什么曾经用过,但现在不用了,MYSQL手册中这一段话说述了这一段的历史:
INNODB发展的早戎,MEMORY ALLOCATOR缺乏性能和扩展性,没有专门为多核CPU设计的MEMORY ALLOCATOR,所以INNODB在MEM模块中写了自己的内存分配器。
但时至今日,操作系统提供的内存分配器已经成熟并具高性能(其实这一段话也不完全对,我们团队在之前压测的过程中遇到的SYS CPU升高的问题,就是用了PTMALLOC引起的,替换成TCMALLOC或者JEMALLOC之后解决)。
基于这个理由,MYSQL INNODB自己写的MEMORY ALLOCATOR实现就没必要存在了。确实,这个应该是专门的MEM ALLOCATOR的工作,MYSQL没必要关注 它。
2、当前注流的MEMORY ALLOCATOR
而PERCONA默认使用的是JEMALLOC
3、代码上的确认
MY_MALLOC.C
注意,MALLOC函数前边加了::全示全局域名,所以是操作系统的MEMORY ALLOCATOR
这个PFS MEMORY是什么宏??
MYSQL8.0.1的说明有一段话
这个应该是开PFS MEMORY INSTRUMENT开关才有的