Mysql基础(七):多线程并发访问Buffer Pool

目录

1、多线程并发访问Mysql

2、生产优化:多个Buffer Pool优化并发能力

3、buffer pool在运行期间动态调整

chunk机制,支持动态调整buffer pool大小

4、buffer pool以及chunk大小


1、多线程并发访问Mysql

       假设MySQL同时接收到了多个请求,他自然会用多个线程来处理这多个请求,每个线程会负责处理一个请求。
        多个线程并发访问一个Buffer Pool,必须要加锁,然后让一个线程先完成一系列操作,比如说加载数据页到缓存页,更新free链表、lru链表、flush链表等,然后释放锁,接着下一个线程再执行一系列操作。
        实际上,即使只有一个Buffer Pool,多个线程加锁排队执行,性能也不会很差。
因为大部分情况下, 每个线程都是查询或者更新缓存页里的数据,这个操作是发生在内存里的,基本都是微秒级 ,很快很快,包括更新free、flush、lru这些链表,他因为都是基于链表进行一些指针操作,性能也是极高的。
        问题是:有的 线程拿 到锁之后,他可能要从磁盘里读取数据页加载到缓存页里去,这还发生了一次磁盘IO呢!时间会多些。
 

2、生产优化:多个Buffer Pool优化并发能力

        给MySQL设置多个Buffer Pool来优化他的并发能力。

         一般来说,MySQL默认的规则是,如果你给Buffer Pool分配的内存小于1GB,那么最多就只会给你一个Buffer Pool。
但是如果你的机器内存很大,那么你必然会给Buffer Pool分配较大的内存,比如给他个8G内存,那么此时你是同时可以设置多个Buffer Pool的,
[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。

         在实际生产环境中,设置多个buffer pool来优化高并发访问性能,是mysql一个很重要的优化技巧。

3、buffer pool在运行期间动态调整

        因为动态调整buffer pool大小,比如buffer pool本来是8G,运行期间你给调整为16G了,此时是怎么实现的呢?

        就是需要这个时候向操作系统申请一块新的16GB的连续内存,然后把现在的buffer pool中的所有缓存页、描述数据块、各种链表,都拷贝到新的16GB的内存中去。这个过程是极为耗时的,性能很低下,是不可以接受的!

chunk机制,支持动态调整buffer pool大小

chunk机制:就是说buffer pool是由很多chunk组成的,他的大小是

innodb_buffer_pool_chunk_size参数控制的,默认值就是128MB。

        所以实际上我们可以来做一个假设,比如现在我们给buffer pool设置一个总大小是8GB,然后有4个buffer pool,那么每个buffer pool就是2GB,此时每个buffer pool是由一系列的128MB的chunk组成的,也就是说每个buffer pool 会有16个chunk。
然后每个buffer pool里的每个chunk里就是一系列的描述数据块和缓存页,每个buffer pool里的多个chunk共享一套free、flush、lru这些链表,

 

4、buffer pool以及chunk大小

           buffer pool大小: 所以通常来说,我们建议一个比较合理的、健康的比例,是给buffer pool设置你的机器内存的50%~60%左右 。比如你有32GB的机器,那么给buffer设置个20GB的内存,剩下的留给OS和其他人来用,这样比较合理一些。
           Chunk大小: buffer pool总大小=(chunk大小 * buffer pool数量)的2倍数

你可能感兴趣的:(Mysql,mysql)