14.8.4 为 InnoDB 配置内存分配器

开发InnoDB时,os 和运行时库附带的内存分配器通常缺乏性能和可伸缩性。那时,还没有为多核 CPU 调整的内存分配器库。因此,InnoDBmem子系统中实现了自己的内存分配器。该分配器由单个 Mutex 保护,该 Mutex 可能成为bottleneckInnoDB还在系统分配器(mallocfree)周围实现了包装器接口,该接口也由单个 Mutex 保护。

如今,随着多核系统变得越来越广泛,并且随着 os 的成熟,对 os 随附的内存分配器也进行了重大改进。与过去相比,这些新的内存分配器性能更好,并且可伸缩性更高。大多数工作负载,特别是那些频繁分配和释放内存的工作负载(例如多 table 联接),都受益于使用更优化的内存分配器,而不是内部的InnoDB专用内存分配器。

通过在 MySQL 选项文件(my.cnfmy.ini)中设置系统配置参数innodb_use_sys_malloc的值,可以控制InnoDB是使用其自己的内存分配器还是 os 的分配器。如果设置为ON1(默认值),则InnoDB使用基础系统的mallocfree功能,而不是 Management 内存池本身。该参数不是动态的,仅在系统启动时才生效。要 continue 使用InnoDB内存分配器,请将innodb_use_sys_malloc设置为0

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

在使用动态链接的类 Unix 系统上,替换内存分配器可能很容易,只要使环境变量LD_PRELOADLD_LIBRARY_PATH指向实现分配器的动态库即可。在其他系统上,可能需要重新链接。请参考您选择的内存分配器库的文档。

由于使用系统内存分配器(innodb_use_sys_mallocON)时InnoDB无法跟踪所有内存使用情况,因此SHOW ENGINE INNODB STATUS命令输出中的“缓冲池和内存”部分仅在“已分配的总内存”中包括缓冲池统计信息。排除使用mem子系统或ut_malloc分配的任何内存。

Note

innodb_use_sys_mallocinnodb_additional_mem_pool_size在 MySQL 5.6 中已弃用,在 MySQL 5.7 中已删除。

有关InnoDB内存使用对性能的影响的更多信息,请参见第 8.10 节“缓冲和缓存”