MySQL: 19 生产经验:如何通过多个Buffer Pool来优化数据库的并发性能

Posted 鮀城小帅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL: 19 生产经验:如何通过多个Buffer Pool来优化数据库的并发性能相关的知识,希望对你有一定的参考价值。

1. Buffer Pool 在访问过程中的加锁机制

Buffer Pool本质就是一大块内存数据结构,由一大堆的缓存页和描述数据块组成的,然后加上了各种链表(free、flush、lru)来辅助它的运行。

如果mysql同时接收到了多个请求,它就会用多个线程来处理这多个请求,每个线程会负责处理一个请求。

这多个线程会同时去访问Buffer Pool,也就是同时去操作里面的缓存页,同时操作一个free链表、flush链表、lru链表。

 这里要注意的是,当多个线程来并发的访问这个Buffer Pool,此时他们都是在访问内存里的一些共享的数据结构,比如说缓存页、各种链表之类的。

这时候,就必须对Buffer Pool加锁,先让一个线程完成一系列的操作,比如说加载数据页到缓存页,更新 free 链表,更新 lru链表,然后释放锁,接着下一个线程再执行一系列的操作。

2. 多线程并发访问加锁,对数据库性能的影响

当多线程并发访问一个 Buffer Pool 的时候必然会加锁,然后很多线程可能要串行着排队,一个一个的依次执行自己要执行的操作。

其实这种多线程加锁排队执行的机制,对数据库的性能影响并不是太大。

因为大部分情况下,每个线程都是查询或者更新缓存页里的数据,这个操作是发生在内存里的,基本都是微秒级的,很快很快,包括更新free、flush、lru这些链表,它因为都是基于链表进行一些指针操作,性能也是极高的。

在某些情况下,有的线程拿到锁之后,需要从磁盘里读取数据页加载到缓存页里去,这还发生了一次磁盘IO呢!所以他要是进行磁盘IO的话,也许耗时就会多一些,那么后面排队等他的线程自然就多等一会儿了。

3.MySQL的生产优化经验:多个Buffer Pool优化并发能力

一般来说,MySQL默认的规则是,如果它给Buffer Pool分配的内存小于1GB,那么最多就只会给你一个Buffer Pool。

如果机器的内存很大,就必然会给 Buffer Pool 分配较大的内存,比如给它个8G内存,那么此时你是同时可以设置多个Buffer Pool的,比如说下面的MySQL服务器端的配置。

[server]
innodb_buffer_pool_size = 8589934592
innodb_buffer_pool_instances = 4

我们给buffer pool设置了8GB的总内存,然后设置了它应该有4个Buffer Pool,也就是说,每个Buffer Pool的大小就是2GB。

根据上面的配置,MySQL在运行的时候就会有4个Buffer Pool了。每个Buffer Pool负责管理一部分的缓存页和描述数据块,有自己独立的 free、flush、lru等链表。

此时在有了多个buffer pool之后,如果有多个线程并发过来访问,就会把压力分散开来了。多线程并发访问的性能会得到成倍的提升。多个线程可以在不同的Buffer Pool中加锁和执行自己的操作,可以并发去执行。

以上是关于MySQL: 19 生产经验:如何通过多个Buffer Pool来优化数据库的并发性能的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow 模型:如何从 proto buff 文件中识别输入/输出节点名称?

如何在kafka中实现多个生产者和多个消费者

开发经验java服务生产环境CPU使用过高解决思路

开发经验java服务生产环境CPU使用过高解决思路

MySQL: 21 生产经验:在生产环境中,基于机器配置来合理设置Buffer Pool

经验之谈:MySQL与ASP.NET配合更强大[2]