加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 服务器 > 安全 > 正文

2017数据库大会实录-MySQL核心参数含义的源码解析

发布时间:2021-01-17 14:01:40 所属栏目:安全 来源:网络整理
导读:《2017数据库大会实录-MySQL核心参数含义的源码解析》要点: 本文介绍了2017数据库大会实录-MySQL核心参数含义的源码解析,希望对您有用。如果有疑问,可以联系我们。 5月11-13日在北京国际会议中心举行数据库大会,有幸得友人推荐在大会上讲了一场.源于自己

另外,前面我们讲到页面更新是在缓存池中先进行的,所以需要考虑这些被修改的页面什么时候刷新到磁盘?以什么样的顺序刷新到磁盘?在innodb buffer pool中,采用的方式是将页面在缓存中的按照第一次修改时间,也就是变成脏页的时间进行排序,flush列表进行排序,由后台刷新线程依次刷新到磁盘,实现修改落地到磁盘.

我们简单介绍了buffer pool的工作机制,我们现在来看buffer pool 里面最重要的三个列表,前面已经讲了两个列表,LRU列表以及flush列表,也就是脏页刷新列表.现在再补充一个列表——空闲列表.空闲列表中的内存块,是没有存放任何数据页的内存块.当没有在缓存池中的页面需要被访问时,它需要先被加载到缓存池中,从而需要从空闲列表中取出一个空闲内存块来缓存这个页面.

在这里提一下,一个bufferpool 可能会分成好几个buffer pool instance,在mysql5.7中,如果不显示设置innodb_buffer_pool_instances这个参数,当innodb buffer size 大于1G的时候,就会默认会分成8个instances,如果小于1G,就只有1个instance.

下面我们来看一下一个数据页的访问流程.

1.? 当访问的页面在缓存池中命中,则直接从缓冲池中访问该页面.

2.? 如果没有命中,则需要将这个页面从磁盘上加载到缓存池中,因此需要在缓存池中的空闲列表中找一个空闲的内存块来缓存这个从磁盘读入的页面.

3.? 但存在空闲内存块被使用完的情况,不保证一定有空闲的内存块.假如空闲列表为空,没有空闲的内存块,则需要想办法去产生空闲的内存块.

4.? 首先去LRU列表中找可以替换的内存页面,查找方向是从列表的尾部开始找,如果找到可以替换的页面,将其从LRU列表中摘除,加入空闲列表,然后再去空闲列表中找空闲的内存块.这就是LRU列表中的页面淘汰机制.

5.? 如果在LRU列表中没有找到可以替换的页,则在列表最末尾选择一个页面进行刷新,刷新后加入空闲列表,然后再去空闲列表中取空闲内存块.

因为空闲列表是一个公共的列表,所有的用户线程都可以使用,存在争用的情况.因此,自己产生的空闲内存块有可能会刚好被其他线程所使用,所以用户线程可能会重复执行上面的查找流程,直到找到空闲的内存块为止.

画图跟表述可能没有完全清楚地表达,下面我们来看一下查找空闲内存块的源代码:

这个函数的名称是buf_LRU_get_free_block,单纯从函数的命名来看,我们就能大概猜出这个函数的作用——-获取空闲的内存块.我们来解析这个函数:

1.? 首先看函数的开头部分——我们直接看代码注释,ifthere is a block in the free list,take it .从空闲列表中去获取block,如果获取到,就返回. 这个return,是该函数的唯一返回出口,也就是一定要找到空闲的block才返回,否则一直循环找下去.

2.? 如果没有找到,则从LRU列表的尾部开始找可以替换的BLOCK,第一次查找最多只扫描100个页面,循环进行到第二次时,会查找深度就是整个LRU列表.如果找到可以替换的页,则将其加入到空闲列表,然后再去空闲列表中找.

3.? 如果在LRU列表中没有找到可以替换的页,则进行单页刷新,将脏页刷新到磁盘之后,然后将释放的内存块加入到空闲列表.然后再去空闲列表中取.为什么只做单页刷新呢?因为这个函数的目的是获取空闲内存页,进行脏页刷新是不得已而为之,所以只会进行一个页面的刷新,目的是为了尽快的获取空闲内存块.

中间还有一些细节,包括设置刷新事件,以请求后台刷新线程进行脏页刷新,以及当进行第三次循环时,线程自己先sleep 10 毫秒,然后再去做页面刷新.这些将不再祥描.

通过了解了空闲页面的查找流程之后,我们知道,如果需要刷新脏页来产生空闲页面或者需要扫描整个LRU列表来产生空闲页面的时候,查找空闲内存块的时间就会延长,这个是一个base case,是我们希望尽量避免的.因此,innodb buffer pool 中存在大量可以替换的页面,或者free 列表中一直存在着空闲内存块,对快速获取到空闲内存块起决定性的作用.?在innodbbuffer pool的机制中,是采用何种方式来产生的空闲内存块,以及可以替换的内存页的呢?这就是我们下面要讲的内容——通过后台刷新机制来产生空闲的内存块以及可以替换的页面.

在讲innodb buffer pool的刷新机制之前,我们再来简单看一下有关buffer pool 的参数,这些参数将在后面的源码解析中使用到.

这就是我们接下来要讲的内容:这些函数是跟缓存池后台页面刷新相关的函数.后台刷新的动作由后台刷新协调线程触发,该线程的所有工作内容均由

buf_flush_page_cleaner_coordinator函数完成,我们后面简称它为协调函数.

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读