生产环境,如何调优Buffer Pool?

前面笔者花了三讲已经把Buffer Pool的原理讲的比较清楚了,我们操作数据库的第一步,就是利用Buffer Pool的缓存来更新或查询。

Buffer Pool本质上就是一大块内存,加上一堆的缓存页和描述数据块,再加上三种链表,free链表,flush链表,lru链表。

假设只有一个Buffer Pool,MySQL同时收到多个请求,多线程并发的请求Buffer Pool会怎样?

肯定会有并发问题。

图片

所以一般生产环境,会配置多个Buffer Pool,以此来优化MySQL的并发能力。

一般如果你给Buffer Pool分配的内存小于1G,那么最多就只给你一个Buffer Pool。

如果你机器内存很大,可以配置多个Buffer Pool,比如你给Buffer Pool分配了8G内存,可以这样配置: 

[server]
innodb_buffer_pool_size = 8589934592
innodb_buffer_pool_instances = 4

意思就是,Buffer Pool总大小是8G,一共有4个Buffer Pool,每个大小是2G。

这样的话,你分配了多个Buffer Pool,就可以降低锁竞争,提高多线程访问的并发量了。

图片

 比Buffer Pool更小的存储单位chunk

Buffer Pool动则几个G的大小,在运行期间,可以随时调整Buffer Pool的大小吗?

显然不方便,比如Buffer Pool本来是8G,限制要调整为16G,该怎么办?

就需要先向操作系统申请一块新的16G连续内存,然后把旧的Buffer Pool中的所有缓存页,描述数据库,各种链表都拷贝到16G的内存中去,这个过程必定是非常慢,非常低效的。

所以MySQL设计了一个chunk机制,也就是Buffer Pool是由很多chunk组成,它的大小是由参数innodb_buffer_pool_chunk_size控制的,默认是128M。

比如,我们给Buffer Pool分配的总大小是8G,有4个Buffer Pool实例,那么每个Buffer Pool就是2G大小,每个Buffer Pool由16个chunk组成。

每个chunk里就是一系列的描述数据库和缓存页,每个bufer Pool里的多个chunk共享一套free、flush、lru链表。

图片

chunk本身比较小,就可以动态调整Buffer Pool的大小了。

比如现在Buffer Pool大小是8G,要调整为16G,只需要申请一系列的128M大小的chunk即可,然后把这些申请的chunk分配给Buffer Pool就行了。

生产环境应给给Buffer Pool配置多大内存?

通常来说,建议给Buffer Pool设置你机器内存的50%-60%。

比如你机器内存是32G,那么可以给Buffer Pool分配20G内存,你机器是128G内存,可以给Buffer Pool分配80G内存,剩下的给操作系统和其他应用使用。

确定了Buffer Pool总大小,那要设置多少个Buffer Pool呢?

MySQL5.7的官方文档是这样说的: 

图片

简单来说,就是Buffer Pool大小必须是chunk大小乘以buffer Pool实例数的倍数。如果不是的话,MySQL会自动给你做调整。

记住一个公式:

Buffer Pool总大小 = (chunk大小 * Buffer Pool数量)的倍数

假如Buffer Pool大小是8G,有16个Buffer Pool实例,chunk大小是128M,就是一个合理的配置。

总结:

生产环境的数据库,必须根据机器的内存合理设置buffer pool的大小,然后设置buffer poold的数量。

buffer pool可以有多个实例,每个buffer pool里有多个chunk,它们公用一套链表数据结构,执行crud的时候,就会不停的加载磁盘上的数据页到缓存里来,然后查询和更新缓存页里的数据。

curd的时候,发现缓存页满了,就会把lru链表冷数据去掉数据刷入磁盘,然后加载自己需要的数据页进来。同时后台线程定时把一批缓存页刷入磁盘,释放掉这些缓存页,同时加入free链表。

以上就是全部buffer pool的内部结构和工作原理。

参考文档:

https://dev.mysql.com/doc/refman/5.7/en/innodb-buffer-pool-resize.html

END

如果你喜欢本文,

请长按二维码,关注 南山的架构笔记

图片

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值