加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 电商 > 正文

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

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

前面根据活跃日志量计算所得出的io_capacity的百分比的这个变量——pct_for_lsn,在这里再次被用到.当pct_for_lsn <30时,认为重做日志文件有足够的可用空间,不需要考虑脏页的年龄在buffer pool instance之间分布不均的情况,建议每个buffer刷新相同的数量,需要考虑脏页的年龄分布情况,每个buffer pool instance 所建议刷新的脏页数量不同,老的脏页比较多的buffer pool会被建议刷新更多地数量.

上面就是完整的刷新建议函数的解析,里面涉及到一些相关参数的使用,不知道大家对涉及到参数是否已经了解.

当生成刷新建议之后,就设置刷新请求事件,请求刷新线程进行脏页批量刷新. 函数pc_request特别简单.

1.? 将所有bufferpool instances 的刷新状态设置为PAGE_CLEANER_STATE_REQUESTED,即申请刷新.

2.? 通过设置事件,唤醒/触发page cleaner 线程调用pc_flush_slot函数来进行buffer pool的批量刷新.

Page_cleaner线程收到刷新请求之后,进行批量刷新.函数为pc_flush_slot.

  1. 寻找一个状态为申请刷新的缓存池实例,然后选为刷新对象,将状态修改为flushing..然后执行后面的刷新.
  2. 执行buf_flush_LRU_list函数进行LRU列表的刷新,

3.??执行buf_flush_do_batch批量刷新脏页列表,该buffer pool instance建议刷新的数量slot->n_pages_requested作为该函数参数值,也就是依据建议刷新的页面数来进行刷新.

于LRU列表的刷新的函数buf_flush_LRU_list将scan_depth 变量传递最终传递给buf_flush_LRU_list_batch 函数,在通常情况下,可以简单的理解scan_depth的值来自于数据库参数innodb_lru_scan_deptch参数. 接下来看buf_flush_LRU_list_batch函数.

我们来看这个函数的循环体,我们来看退出循环的条件,满足任何一个条件退出:

1.如果free列表的长度大于innodb_lru_scan_depth,则中止循环.
2.被替换(evict_count)+被刷新(count)的页面数最多为scan_depth,scan_deptch可以简单理解为等于innodb_lru_scan_depth. ? ? ?在看看循环里面的内容:

如果是一个可替换的页,则执行函数buf_LRU_free_page,将从LRU列表中摘除,其加入free列表.evict_count++

如果是脏页,则调用函数buf_flush_page_and_try_neighbors进行刷新,刷新数量累计到count值.

由此我们可以看出innodb_lru_scan_depth参数,在此起非常关键的作用,实际上也直接影响了buffer bool instance中的free列表的长度.

对于脏页列表批量刷新的函数.

slot->n_pages_requested:为之前介绍的刷新建议函数

page_cleaner_flush_pages_recommendation为该buffer pool instance所建议的需要刷新的页面的数量,实际刷新的页面并不一定等于该值.后面将详细介绍.这个值最终传递给buf_do_flush_list_batch函数的min_n参数.

我们来看一下这个函数,该函数主要逻辑也是一个for循环,我们来看一下循序中止的条件:

直到 count? >= min_n 或者脏页列表为空.? 即所刷新的page等于所建议的刷新数量,或者“脏”页列表为空.

因为page cleaner线程调用该函数做批量刷新的时候,lsn_limit 参数值为极大值,因此无需考虑page的oldest_modification.

刷新协调函数的执行一个刷新循环的最后一步,等待所有buffer pool instance刷新的完成.

函数特别简单,就是设置事件等待,等待所有buffer pool instance刷新完成的事件触发.

刷新完成之后,然后开始下一轮循环,如果刷新在1秒之内完成,则刷新协调线程会有短暂的sleep才会发起下一次刷新.期望是1秒钟进行一次所有buffer pool instance的批量刷新.

当作者把实录写完,也跪了——原来有这么多内容,终于理解现场90%以上的听众没有听懂的原因了.

实录太长,有失误之处烦请留言指出,谢谢!

文章来自微信公众号:数据库随笔

(编辑:核心网)

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

热点阅读