共计 1592 个字符,预计需要花费 4 分钟才能阅读完成。
这篇文章主要介绍“innodb 新特性之怎么使用 buffer pool 动态调整大小”,在日常操作中,相信很多人在 innodb 新特性之怎么使用 buffer pool 动态调整大小问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”innodb 新特性之怎么使用 buffer pool 动态调整大小”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!
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
如果是收缩内存
开始 resize
如果禁用了 AHI,此时开启
锁住所有 instance 的 buffer_pool,page_hash
收缩 pool:以 chunk 为单位释放要收缩的内存
清空 withdraw 列表 buf_pool- withdraw
增大 pool: 分配新的 chunk
重新分配 buf_pool- chunks
如果改变 / 缩小超过 2 倍,会重置 page hash,改变桶大小
释放 buffer_pool,page_hash 锁
如果改变 / 缩小超过 2 倍, 会重启和 buffer pool 大小相关的内存结构,如锁系统 (lock_sys_resize),AHI(btr_search_sys_resize), 数据字段(dict_resize) 等
计算需收缩的 chunk 数,从 chunks 开始尾部删除指定个数的 chunk.
锁 buf_pool
从 free_list 中摘除待删 chunk 的 page 放入待删链表 buf_pool- withdraw
如果待删 chunk 的 page 为脏页,则刷脏
重新加载 LRU 中要删除的页,从 LRU 中摘除,重新从 free 列表获取 page 老的 page 放入待删链表 buf_pool- withdraw
释放 buffer pool 锁
如果需收缩的 chunk pages 没有收集全,重复 2 -6
由上可以看出,扩大内存比缩小内存相对容易些。缩小内存时,如果遇到有事务一直未提交且占用了待收缩的 page 时,导致收缩一直重试,error log 会打印这种重试信息,包含可能引用此问题的事务信息。为了避免频繁重试,每次重试的时间间隔会指数增长。
以上步骤中 resize 阶段 buffer pool 会不可用,此阶段会锁所有 buffer pool, 但此阶段都是内存操作,时间比较短。收缩内存阶段耗时可能会很长,也有一定影响,但是每次都是以 instance 为单位进行锁定的。总的来说,buffer pool 动态调整大小对应用的影响并不大。
重新加载 LRU 中要删除的页的影响
search 过程中 btr 游标保存的 page 可能重新加载过,自适应哈希保存的 root page 也可能重新加载过, 都需要重新读取。
到此,关于“innodb 新特性之怎么使用 buffer pool 动态调整大小”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!