searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

MYSQL的内存分配器分析

2023-08-02 06:13:24
52
0

一、 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开关才有的

 

 

0条评论
0 / 1000
c****n
5文章数
0粉丝数
c****n
5 文章 | 0 粉丝
原创

MYSQL的内存分配器分析

2023-08-02 06:13:24
52
0

一、 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开关才有的

 

 

文章来自个人专栏
cygwing专栏
5 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0