Ⅰ、缓冲池介绍
innodb存储引擎缓冲池(buffer pool) ,类似于oracle的sga,里面放着数据页 、索引页 、change buffer 、自适应哈希 、锁(5.5之前)等内容
综上所示:
每次读写数据都是通过Buffer Pool
当Buffer Pool中没有用户所需要的数据时才去硬盘中获取
通过innodb_buffer_pool_size进行设置总容量,该值设置的越大越好
Ⅱ、缓冲池性能问题
2.1 性能线性扩展
假设服务器72核,ht超线程后,144个逻辑核,跑测试按道理144个核应该跑满,如果跑不满,就说明并发有瓶颈,我加核了,却用不上,性能上不去
5.1之前这个问题经常被吐槽,现在不存在这个问题了
1G空间下面如果有65536个page,对这些page进行管理,每次都要对bp加锁(latch),如果bp大了,就有瓶颈,这里说的锁是bp的latch,和数据库的lock不是一回事
qps达到1w,每秒钟要获得至少1w次latch(就看bp的latch,不谈释放和唤醒latch),开销比较大
核比较多,latch或者并发设计的不好,性能则不能线性扩展 ,而这个bp对于扩展性非常重要,所有的热点的page都在里面,每次访问这些page都要获得bp的latch
2.2 如何提升上述缓冲池性能问题
调整innodb_buffer_pool_instances参数,设置为cpu的数量
默认5.5为1,5.6和5.7是8(前提是缓冲池大于1G)
假设开始这个值是1,现调整为4,原来1个bp管理65536个页,现在4个bp,每个bp管理16384个页,拆成4个分片,将热点打散,latch变少了,并发性能提升了,这是非常常见的内核层对并发调优的手段,经测试,不调整与调整后性能相差30%
tips:
设置多个缓冲池的时候,必须满足每个池子大于1G才生效,否则,即使my.cnf中设置了innodb_buffer_pool_instances,重启看看是没用的
Ⅲ、buffer pool中热点数据的管理
3.1 buffer pool的组成
缓冲池中的热点是以page为单位来管理,并不是三种List加起来等于总的bp大小,而是Free List + LRU List(Flush List是包含在LRU list里面的)
Free List 放空白的page
buffer Pool刚启动时,有一个个16K的空白的页,这些页就存放(链表串联)在Free List中
LRU List 包括LRU和unzip_LRU
当读取一个数据页的时候,就从Free List中取出一个页,存入数据,并将该页读到LRU List中
当Free List给一个页给LRU List时,这个过程中需要一个并发控制,也就是之前说的latch,假设现在有两个线程都读到磁盘上这个页,则都需要问Free List来申请空闲页,谁先来先给谁,latch就是对这三个List进行并发控制访问的
Flush List包含脏页(数据经过修改,但是未刷入磁盘的页),根据oldest_lsn进行排序
假设被读到的页,马上被更新,这个页就叫脏页,会被放入到Flush List列表中,但只是放了一个指针,而不是实际的页(只要修改过,就放入,不管修改几次)
如何查看缓冲池中的脏页?