在InnoDB
开发时,随操作系统和运行时库提供的内存分配器通常缺乏性能和可扩展性。那时,还没有针对多核 CPU 调整的内存分配器库。因此,在子系统InnoDB
中实现了自己的内存分配器。mem
这个分配器由一个互斥体保护,这可能成为一个
瓶颈。
InnoDB
还围绕系统分配器 (malloc
和
free
) 实现了一个包装器接口,该接口同样由单个互斥锁保护。
今天,随着多核系统变得越来越广泛,并且随着操作系统的成熟,操作系统提供的内存分配器已经有了显着的改进。与过去相比,这些新的内存分配器性能更好,可扩展性更强。大多数工作负载,尤其是那些频繁分配和释放内存的工作负载(例如多表连接),都受益于使用高度优化的内存分配器,而不是内部特定的
InnoDB
内存分配器。
您可以通过在 MySQL 选项文件(或
)InnoDB
中设置系统配置参数的值来控制是使用自己的内存分配器还是操作系统的分配器
。如果设置为or
(默认值),则使用底层系统的和
函数而不是管理内存池本身。该参数不是动态的,只有在系统启动时才会生效。要继续使用
内存分配器,请设置
为
。
innodb_use_sys_malloc
my.cnf
my.ini
ON
1
InnoDB
malloc
free
InnoDB
innodb_use_sys_malloc
0
当InnoDB
内存分配器被禁用时,
InnoDB
忽略参数的值
innodb_additional_mem_pool_size
。内存分配器使用额外的InnoDB
内存池来满足分配请求,而不必退回到系统内存分配器。当
InnoDB
内存分配器被禁用时,所有此类分配请求都由系统内存分配器完成。
在使用动态链接的类 Unix 系统上,替换内存分配器可能就像创建环境变量
LD_PRELOAD
或
LD_LIBRARY_PATH
指向实现分配器的动态库一样简单。在其他系统上,可能需要重新链接。请参阅您选择的内存分配器库的文档。
由于InnoDB
在使用系统内存分配器时无法跟踪所有内存使用情况(innodb_use_sys_malloc
是
ON
),命令输出中的“ BUFFER POOL AND MEMORY ”SHOW ENGINE INNODB
STATUS
部分仅包括“ Total memory allocated ”中的缓冲池统计信息。mem
使用子系统或使用
分配的任何内存ut_malloc
都被排除在外。
innodb_use_sys_malloc
并
innodb_additional_mem_pool_size
在 MySQL 5.6 中弃用并在 MySQL 5.7 中删除。
有关
InnoDB
内存使用的性能影响的更多信息,请参阅
第 8.10 节,“缓冲和缓存”。