MySQL 配置InnoDB的内存分配器

配置InnoDB的内存分配器
在开发InnoDB时,操作系统和运行时库提供的内存分配器通常缺乏性能和可伸缩性。那时,还没有针对多核cpu调优的内存分配器库。因此,InnoDB在mem子系统中实现了自己的内存分配器。这个分配器由一个互斥锁保护,这可能成为瓶颈。InnoDB还围绕系统分配器(malloc和free)实现了一个包装器接口,它同样由一个互斥锁保护。

今天,随着多核系统的广泛应用,以及操作系统的成熟,操作系统所提供的内存分配器已经有了显著的改进。与过去相比,这些新的内存分配器性能更好,可伸缩性更强。大多数工作负载,特别是那些经常分配和释放内存的工作负载(比如多表连接),比使用一个内部的、特定于innodb的内存分配器更好的内存分配器。

你可以通过在MySQL选项文件(my.cnf或my.ini)中设置系统配置参数innodb_use_sys_malloc的值来控制InnoDB是使用自己的内存分配器还是操作系统的分配器。如果设置为ON或1(默认值),InnoDB使用底层系统的malloc和free函数,而不是自己管理内存池。该参数为非动态配置,仅在系统启动时生效。如果需要继续使用InnoDB内存分配器,请将innodb_use_sys_malloc设置为0。

当InnoDB内存分配器被禁用时,InnoDB会忽略参数innodb_additional_mem_pool_size的值。InnoDB内存分配器使用一个额外的内存池来满足分配请求,而不必回到系统内存分配器。当InnoDB内存分配器被禁用时,所有这样的分配请求都由系统内存分配器来完成。

在使用动态链接的类似于unixr的系统上,只需让环境变量LD_PRELOAD或LD_LIBRARY_PATH指向实现该分配器的动态库,就可以轻松地替换内存分配器。在其他系统上,可能需要进行一些重新链接。请参考您所选择的内存分配器库的文档。

因为当系统内存分配器被使用时(innodb_use_sys_malloc是ON), InnoDB不能跟踪所有内存的使用情况,所以在SHOW ENGINE InnoDB STATUS命令的输出中BUFFER POOL AND memory部分只包括Total memory allocation中的BUFFER POOL统计信息。任何使用mem子系统或使用ut_malloc分配的内存都被排除在外。

发表评论

电子邮件地址不会被公开。