5.7 开始支持buffer pool 动态调整大小,每个
buffer_pool_instance都由同样个数的chunk组成(chunks数组), 每个chunk内存大小为
innodb_buffer_pool_chunk_size(实际会偏大5%,用于存放chuck中的block信息)。buffer pool以
innodb_buffer_pool_chunk_size为单位进行动态增大和缩小。调整前后
innodb_buffer_pool_size应一直保持是
innodb_buffer_pool_chunk_size*
innodb_buffer_pool_instances的倍数。
同样的buffer pool动态调整大小由后台线程
buf_resize_thread,set命令会立即返回。通过
InnoDB_buffer_pool_resize_status可以查看调整的运行状态。
resize流程
如果开启了AHI,需禁用AHI
由上可以看出,扩大内存比缩小内存相对容易些。缩小内存时,如果遇到有事务一直未提交且占用了待收缩的page时,导致收缩一直重试,error log会打印这种重试信息, 包含可能引用此问题的事务信息。为了避免频繁重试,每次重试的时间间隔会指数增长。
以上步骤中resize阶段buffer pool会不可用,此阶段会锁所有buffer pool, 但此阶段都是内存操作,时间比较短。收缩内存阶段耗时可能会很长,也有一定影响,但是每次都是以instance为单位进行锁定的。 总的来说,buffer pool 动态调整大小对应用的影响并不大。
重新加载LRU中要删除的页的影响
search 过程中btr游标保存的page可能重新加载过,自适应哈希保存的root page也可能重新加载过, 都需要重新读取。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30135314/viewspace-2708204/ ,如需转载,请注明出处,否则将追究法律责任。