MySQL参数解析innodb_max_dirty_pages_pct
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,工作线程
- 协调线程中有一个while循环,每1秒执行一次脏页百分比的检查,当脏页百分比超过阈值,触发事件,唤醒工作线程,执行刷脏页的操作。
os_event_set(page_cleaner->is_requested); - 工作线程中有一个while循环,主要在等待刷脏页的事件,如果事件被触发,工作线程就会执行刷脏页的操作,刷完脏页之后,继续等待事件,等待下一次被唤醒。
os_event_wait(page_cleaner->is_requested);
(3)函数调用关系
协调线程通过调用一系列的函数,来获取脏页百分比,判断是否需要刷脏页,函数调用关系如下:
- buf_flush_page_cleaner_coordinator()
- page_cleaner_flush_pages_recommendation()
- af_get_pct_for_dirty()
- page_cleaner_flush_pages_recommendation()
(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触发刷脏页以外,还有很多条件,也会触发刷脏页,主要包括:
- REDO日志快满的时候。
- 为了保证MySQL中的空闲页面的数量,会从LRU 链表尾部淘汰一部分页面作为空闲页。如果对应的页面是脏页的话,就需要先将页面刷到磁盘。
- MySQL实例正常关闭时候。
MySQL参数解析innodb_max_dirty_pages_pct相关推荐
- mysql innodbmaxdirtypagespct_MySQL参数解析innodb_max_dirty_pages_pct
innodb_max_dirty_pages_pct 是 MySQL InnoDB 存储引擎非常重要的一个参数,用来控制buffer pool中脏页的百分比,当脏页数量占比超过这个参数设置的值时,In ...
- SpringMVC源码之参数解析绑定原理
摘要 本文从源码层面简单讲解SpringMVC的参数绑定原理 SpringMVC参数绑定相关组件的初始化过程 在理解初始化之前,先来认识一个接口 HandlerMethodArgumentResolv ...
- 【MySQL原理解析】01. 一条SQL查询语句是如何执行的
这是[MySQL原理解析]的第一篇文章,MySQL我看了很多的书与教程,对其原理有一定的理解,一直想写一系列的文章来把MySQL的原理给讲清楚,一直没有时间写,今天算是个开头吧.万事开头难,咱们先破了 ...
- mysql新增列并同时增加数据_图解MySQL | [原理解析] MySQL 为表添加列 是怎么quot;立刻quot;完成的...
在上一期图解 图解MySQL | MySQL DDL为什么成本高?中,我们介绍了: 传统情况下,为表添加列需要对表进行重建 腾讯团队为 MySQL 引入了 Instant Add Column 的方案 ...
- mysql新增字段位置_图解MySQL | [原理解析] MySQL 为表添加列 是怎么quot;立刻quot;完成的...
在上一期图解 图解MySQL | MySQL DDL为什么成本高?中,我们介绍了: 传统情况下,为表添加列需要对表进行重建 腾讯团队为 MySQL 引入了 Instant Add Column 的方案 ...
- log解析工具 px4_详解MySQL Binlog解析工具--binlog2sql,基于表级别的数据恢复
概述 最近碰到某个表需要做数据回退,如果回退整个数据库动作又太大,所以用了binlog2sql来实现,这里先介绍一下binlog2sql的相关内容. binlog2sql是一个开源的Python开发的 ...
- mysql参数积累 持续更新。。。
mysql参数积累 持续更新... 以下是Mysql数据库服务器配置文件my.ini的详细配置.应用场合是InnoDB引擎,2核CPU, 32位SUSE. [client] #password = y ...
- MySQL存储过程 — 解析 XML 数据并实现插入操作
MySQL存储过程 - 解析 XML 数据并实现插入操作 一.概述: 最近在做项目的过程中,需要利用MySQL存储过程 解析 XML数据并进行插入操作,因此就学习了下.MySQL 解析 XML 的思路 ...
- MySQL Binlog 解析工具 Maxwell 详解
maxwell 简介 Maxwell是一个能实时读取MySQL二进制日志binlog,并生成 JSON 格式的消息,作为生产者发送给 Kafka,Kinesis.RabbitMQ.Redis.Goog ...
最新文章
- 单调队列 Monotonic Queue / 单调栈 Monotonic Stack
- node.js常见的模块
- 数据库-mysql基础操作之输入查询
- React Fiber源码逐个击破系列-scheduler
- 服务器的性能监测及工具(profmon)
- 请写出3个Android布局,一起撸一波干货集中营练练手Android(三)布局+实现篇
- Linux Shell文本处理工具集锦
- 读懂Android中的代码混淆
- Clob 2 String
- c#语言asp.net实现treeview控件读数据库动态生成树的代码
- java异常处理中的返回值
- 关于sql server 代理(已禁用代理xp)
- java流作为参数,java-8 – 将Java 8流映射函数作为参数传递
- cwe_checker 二进制静态漏洞检测工具的安装与使用
- 计算机内图片怎么自定义排序,win7电脑中如何设置图片排序方式?
- sql 错误码 备用
- Cannot pull, git cannot resolve reference ORIG_HEAD
- 关于S参数的一些理解
- java使用keytool 的ssl证书的导入、查看与删除——彻底解决unable to find valid certification path to requested target(好文章!)
- 微信定位和HTML5定位
热门文章
- html:运用弹性布局写一个热门活动简介表
- 救人于无形的“环境智能”,到底是一种什么智能?
- 4.文件---读文件read
- 计算机网络之HTTPS协议
- 算法——二分法查找(binarySearch)
- Pytorch的RELU函数
- TypeError: quantize() got an unexpected keyword argument ‘empty_init‘解决方案
- keystone -- An unexpected error prevented the server from fulfilling your request. 错误
- 开源工作流系统java整合activiti,快速开发平台
- NOI / 2.5基本算法之搜索1792:迷宫(详细讲解)