当InnoDB
在开发时,操作系统和运行时库提供的内存分配器通常缺乏性能和可伸缩性。当时,还没有针对多核cpu调优的内存分配器库。因此,InnoDB
中实现了自己的内存分配器mem
子系统。这个分配器由一个互斥锁保护,它可能变成瓶颈.InnoDB
还实现了围绕系统分配器(malloc
而且免费的
),同样由一个互斥锁保护。
今天,随着多核系统的广泛使用,以及操作系统的成熟,操作系统所提供的内存分配器已经有了显著的改进。与过去相比,这些新的内存分配器性能更好,可伸缩性更强。大多数工作负载,特别是那些经常分配和释放内存的工作负载(例如多表连接),都受益于使用更调优的内存分配器,而不是使用内部的内存分配器。InnoDB
特定的内存分配器。
你可以控制是否InnoDB
通过设置系统配置参数的值,使用自己的内存分配器或操作系统的分配器innodb_use_sys_malloc
在MySQL选项文件(my.cnf
或my.ini
).如果设置为在
或1
(默认),InnoDB
使用malloc
而且免费的
底层系统的功能,而不是管理内存池本身。该参数不是动态的,仅在系统启动时生效。继续使用InnoDB
内存分配器,设置innodb_use_sys_malloc
来0
.
当InnoDB
内存分配器已禁用,InnoDB
忽略参数的值innodb_additional_mem_pool_size
.的InnoDB
内存分配器使用一个额外的内存池来满足分配请求,而不必返回到系统内存分配器。当InnoDB
当内存分配器被禁用时,所有这样的分配请求都由系统内存分配器来完成。
在使用动态链接的类unix系统上,替换内存分配器可能就像设置环境变量一样简单LD_PRELOAD
或LD_LIBRARY_PATH
指向实现分配器的动态库。在其他系统上,可能需要进行一些重新链接。请参考您选择的内存分配器库的文档。10bet官方网站
自InnoDB
使用系统内存分配器时,无法跟踪所有内存使用情况(innodb_use_sys_malloc
是在
),该部分”缓冲池和内存”的输出中显示引擎innodb状态
命令中只包含缓冲池的统计信息”已分配内存总量”.属性分配的任何内存mem
子系统或使用ut_malloc
是排除在外。
innodb_use_sys_malloc
而且innodb_additional_mem_pool_size
在MySQL 5.6中已弃用,并在MySQL 5.7中被删除。
的性能影响的详细信息InnoDB
内存使用情况,请参见第8.10节,“缓冲和缓存”.