innodb_buffer_pool_instances - xiaoboluo768/qianjinliangfang GitHub Wiki
- 调整缓存池实例数量,减少内部对缓存池数据结构的争用
- 由于mysql内部不同线程对innodb缓存池的访问在某些阶段是互斥的,这种内部竞争也会产生性能问题,尤其在高并发和buffer pool较大的情况下(将缓冲池分为多个单独的实例可以减少不同线程读取和写入缓存页面时的争用,从而提高并发性。,每个页面存储到缓冲池中或从缓冲池读取时都使用散列函数随机分配给其中一个缓冲池实例。每个缓冲池实例都独立管理自己的空闲列表(free lists),刷新列表(flush lists),LRUs和连接到缓冲池的所有其他数据结构,并由其自己的缓冲池互斥体保护临界),所以,innodb的缓存系统引入了innodb_buffer_pool_instances配置参数,对于较大的缓存池,可以适当增大这个参数的值(默认是1,最大为64),可以降低并发导致的缓存访问冲突,改善性能,Innodb缓存系统会将参数innodb_buffer_pool_size指定的大小平均分配为此参数指定的数量个buffer pool
- 此选项在innodb_buffer_pool_size大于1G时生效,小于1G时就算该参数设置大于1也不会生效即只有一个buffer pool实例。另外,innodb_buffer_pool_size设置大于1G时,请尽量保证每个instance的大小足够1G。
- 全局变量,只读变量,默认值在innodb_buffer_pool_size小于1G时为1,大于1G时为8,在32位WIN平台上是自动计算的(如果innodb_buffer_pool_size大于1.3GB,则innodb_buffer_pool_instances的默认值为innodb_buffer_pool_size / 128MB,每个块具有单独的内存分配请求。小于1.3G时则instance默认值为1。选择1.3GB作为边界,在该边界处存在32位Windows无法分配单个缓冲池所需的连续地址空间的重大风险)
- 注意,在5.6版本中有一个BUG,可能导致在innodb_buffer_pool_size小于1G时show variables查看到的innodb_buffer_pool_size_instance默认值为8(Bug#18343670),你可以通过show engine innodb status语句查看真实的缓冲池实例数量,如果有多个真实的缓冲池实例存在,则输出结果中会有一个INDIVIDUAL BUFFER POOL INFO输出部分。
上一篇:innodb_buffer_pool_size | 下一篇:innodb_buffer_pool_dump_at_shutdown