一、多实例BufferPool的概述
- 在Buffer Pool特别大并且多线程并发访问量特别高的情况下,单一的Buffer Pool可能会影响请求的处理速度。所以,在Buffer Pool特别大时,可以把它们拆分成若干个小的Buffer Pool,每个Buffer Pool都称为一个实例。它们都是独立的(即独立地申请内存空间,独立地管理各种链表)。
- 可以通过设置innodb_buffer_pool_instances的值来修改Buffer Pool实例的个数。
-
每个Buffer Pool实例实际占用多少内存空间呢,通过如下公式计算:
# 缓冲池实际占用内存空间 = 缓冲池大小 ÷ 缓冲池实例的个数 innodb_buffer_pool_size ÷ innodb_buffer_pool_instances
-
由于管理Buffer Pool也是需要性能开销的,所以也并不是实例越多越好。
-
InnoDB规定,当innodb_buffer_pool_size小于1GB时,设置多个实例是无效的,在这种情况下,即使你设置的innodb_buffer_pool_instances不为1,那么InnoDB默认也会把它改为1。
-
innodb_buffer_pool_size必须是innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances的倍数。否则服务器会自动把innodb_buffer_pool_size的值调整为【innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances】结果的整数倍。
例如 innodb_buffer_pool_chunk_size=128MB innodb_buffer_pool_instances=16 那么 innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances=2GB 如果 我们设置innodb_buffer_pool_size=9GB,则会被自动调整为10GB
-
在服务启动时,如果innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances > innodb_buffer_pool_size的值,那么innodb_buffer_pool_chunk_size的值会被服务器自动的设置为innodb_buffer_pool_size ÷ innodb_buffer_pool_instances的值。
例如 innodb_buffer_pool_chunk_size=256MB innodb_buffer_pool_instances=16 那么 innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances=4GB 如果 我们设置innodb_buffer_pool_size=2GB,因为4GB > 2GB, 则innodb_buffer_pool_chunk_size被修改为128MB。