innodb_max_dirty_pages_pct 是 MySQL InnoDB 存储引擎非常重要的一个参数,用来控制buffer pool中脏页的百分比,当脏页数量占比超过这个参数设置的值时,InnoDB会启动刷脏页的操作。该参数只控制脏页百分比,并不会影响刷脏页的速度。

innodb_max_dirty_pages_pct 参数可以动态调整,最小值为0, 最大值为99.99,默认值为 75。

innodb_max_dirty_pages_pct参数源码解析

源码版本:5.7.19

(1)保存脏页百分比的变量

在InnoDB源码中,innodb_max_dirty_pages_pct参数值保存在变量srv_max_buf_pool_modified_pct 里面,这是一个全局变量,初始值为 75.0,如下:

double      srv_max_buf_pool_modified_pct = 75.0;

(2)刷脏页的线程

InnoDB刷脏页主要通过两类线程来实现,这两类线程分别是:

  • buf_flush_page_cleaner_coordinator,协调线程
  • buf_flush_page_cleaner_worker,工作线程
  1. 协调线程中有一个while循环,每1秒执行一次脏页百分比的检查,当脏页百分比超过阈值,触发事件,唤醒工作线程,执行刷脏页的操作。
    os_event_set(page_cleaner->is_requested);
  2. 工作线程中有一个while循环,主要在等待刷脏页的事件,如果事件被触发,工作线程就会执行刷脏页的操作,刷完脏页之后,继续等待事件,等待下一次被唤醒。
    os_event_wait(page_cleaner->is_requested);

(3)函数调用关系

协调线程通过调用一系列的函数,来获取脏页百分比,判断是否需要刷脏页,函数调用关系如下:

  • buf_flush_page_cleaner_coordinator()

    • page_cleaner_flush_pages_recommendation()

      • af_get_pct_for_dirty()

(4)af_get_pct_for_dirty()函数的实现

af_get_pct_for_dirty() 函数调用buf_get_modified_ratio_pct()获取已修改页的百分比,然后与srv_max_dirty_pages_pct_lwm及srv_max_buf_pool_modified_pct变量进行比较,最终返回一个0~100的值,给上层调用函数,来决定是否需要刷脏页。af_get_pct_for_dirty()函数具体实现如下:

static
ulint
af_get_pct_for_dirty()
/*==================*/
{double dirty_pct = buf_get_modified_ratio_pct();if (dirty_pct == 0.0) {/* No pages modified */return(0);}ut_a(srv_max_dirty_pages_pct_lwm<= srv_max_buf_pool_modified_pct);if (srv_max_dirty_pages_pct_lwm == 0) {/* The user has not set the option to preflush dirtypages as we approach the high water mark. */if (dirty_pct >= srv_max_buf_pool_modified_pct) {/* We have crossed the high water mark of dirtypages In this case we start flushing at 100% ofinnodb_io_capacity. */return(100);}} else if (dirty_pct >= srv_max_dirty_pages_pct_lwm) {/* We should start flushing pages gradually. */return(static_cast<ulint>((dirty_pct * 100)/ (srv_max_buf_pool_modified_pct + 1)));}return(0);
}

(5)其他触发刷脏页的场景

除了脏页百分比达到阈值innodb_max_dirty_pages_pct触发刷脏页以外,还有很多条件,也会触发刷脏页,主要包括:

  1. REDO日志快满的时候。
  2. 为了保证MySQL中的空闲页面的数量,会从LRU 链表尾部淘汰一部分页面作为空闲页。如果对应的页面是脏页的话,就需要先将页面刷到磁盘。
  3. MySQL实例正常关闭时候。

MySQL参数解析innodb_max_dirty_pages_pct相关推荐

  1. mysql innodbmaxdirtypagespct_MySQL参数解析innodb_max_dirty_pages_pct

    innodb_max_dirty_pages_pct 是 MySQL InnoDB 存储引擎非常重要的一个参数,用来控制buffer pool中脏页的百分比,当脏页数量占比超过这个参数设置的值时,In ...

  2. SpringMVC源码之参数解析绑定原理

    摘要 本文从源码层面简单讲解SpringMVC的参数绑定原理 SpringMVC参数绑定相关组件的初始化过程 在理解初始化之前,先来认识一个接口 HandlerMethodArgumentResolv ...

  3. 【MySQL原理解析】01. 一条SQL查询语句是如何执行的

    这是[MySQL原理解析]的第一篇文章,MySQL我看了很多的书与教程,对其原理有一定的理解,一直想写一系列的文章来把MySQL的原理给讲清楚,一直没有时间写,今天算是个开头吧.万事开头难,咱们先破了 ...

  4. mysql新增列并同时增加数据_图解MySQL | [原理解析] MySQL 为表添加列 是怎么quot;立刻quot;完成的...

    在上一期图解 图解MySQL | MySQL DDL为什么成本高?中,我们介绍了: 传统情况下,为表添加列需要对表进行重建 腾讯团队为 MySQL 引入了 Instant Add Column 的方案 ...

  5. mysql新增字段位置_图解MySQL | [原理解析] MySQL 为表添加列 是怎么quot;立刻quot;完成的...

    在上一期图解 图解MySQL | MySQL DDL为什么成本高?中,我们介绍了: 传统情况下,为表添加列需要对表进行重建 腾讯团队为 MySQL 引入了 Instant Add Column 的方案 ...

  6. log解析工具 px4_详解MySQL Binlog解析工具--binlog2sql,基于表级别的数据恢复

    概述 最近碰到某个表需要做数据回退,如果回退整个数据库动作又太大,所以用了binlog2sql来实现,这里先介绍一下binlog2sql的相关内容. binlog2sql是一个开源的Python开发的 ...

  7. mysql参数积累 持续更新。。。

    mysql参数积累 持续更新... 以下是Mysql数据库服务器配置文件my.ini的详细配置.应用场合是InnoDB引擎,2核CPU, 32位SUSE. [client] #password = y ...

  8. MySQL存储过程 — 解析 XML 数据并实现插入操作

    MySQL存储过程 - 解析 XML 数据并实现插入操作 一.概述: 最近在做项目的过程中,需要利用MySQL存储过程 解析 XML数据并进行插入操作,因此就学习了下.MySQL 解析 XML 的思路 ...

  9. MySQL Binlog 解析工具 Maxwell 详解

    maxwell 简介 Maxwell是一个能实时读取MySQL二进制日志binlog,并生成 JSON 格式的消息,作为生产者发送给 Kafka,Kinesis.RabbitMQ.Redis.Goog ...

最新文章

  1. 单调队列 Monotonic Queue / 单调栈 Monotonic Stack
  2. node.js常见的模块
  3. 数据库-mysql基础操作之输入查询
  4. React Fiber源码逐个击破系列-scheduler
  5. 服务器的性能监测及工具(profmon)
  6. 请写出3个Android布局,一起撸一波干货集中营练练手Android(三)布局+实现篇
  7. Linux Shell文本处理工具集锦
  8. 读懂Android中的代码混淆
  9. Clob 2 String
  10. c#语言asp.net实现treeview控件读数据库动态生成树的代码
  11. java异常处理中的返回值
  12. 关于sql server 代理(已禁用代理xp)
  13. java流作为参数,java-8 – 将Java 8流映射函数作为参数传递
  14. cwe_checker 二进制静态漏洞检测工具的安装与使用
  15. 计算机内图片怎么自定义排序,win7电脑中如何设置图片排序方式?
  16. sql 错误码 备用
  17. Cannot pull, git cannot resolve reference ORIG_HEAD
  18. 关于S参数的一些理解
  19. java使用keytool 的ssl证书的导入、查看与删除——彻底解决unable to find valid certification path to requested target(好文章!)
  20. 微信定位和HTML5定位

热门文章

  1. html:运用弹性布局写一个热门活动简介表
  2. 救人于无形的“环境智能”,到底是一种什么智能?
  3. 4.文件---读文件read
  4. 计算机网络之HTTPS协议
  5. 算法——二分法查找(binarySearch)
  6. Pytorch的RELU函数
  7. TypeError: quantize() got an unexpected keyword argument ‘empty_init‘解决方案
  8. keystone -- An unexpected error prevented the server from fulfilling your request. 错误
  9. 开源工作流系统java整合activiti,快速开发平台
  10. NOI / 2.5基本算法之搜索1792:迷宫(详细讲解)