`

InnoDB 刷脏页的控制策略

 
阅读更多
InnoDB 使用缓冲池(buffer pool)管理内存,缓冲池中的内存页有三种状态:
第一种是,还没有使用的;
第二种是,使用了并且是干净页;
第三种是,使用了并且是脏页。
InnoDB 的策略是尽量使用内存,因此对于一个长时间运行的库来说,未被使用的页面很少。

而当要读入的数据页没有在内存的时候,就必须到缓冲池中申请一个数据页。这时候只能把最久不使用的数据页从内存中淘汰掉:如果要淘汰的是一个干净页,就直接释放出来复用;但如果是脏页呢,就必须将脏页先刷到磁盘,变成干净页后才能复用。

所以,刷脏页虽然是常态,但是出现以下这两种情况,都是会明显影响性能的:

.一个查询要淘汰的脏页个数太多,会导致查询的响应时间明显变长;
.日志写满,更新全部堵住,写性能跌为 0,这种情况对敏感业务来说,是不能接受的。

所以,InnoDB 需要有控制脏页比例的机制,来尽量避免上面的这两种情况。

刷脏页的控制策略
接下来说说 InnoDB 脏页的控制策略,以及和这些策略相关的参数。

首先,你要正确地告诉 InnoDB 所在主机的 IO 能力,这样 InnoDB 才能知道需要全力刷脏页的时候,可以刷多快。
这就要用到 innodb_io_capacity 这个参数了,它会告诉 InnoDB 你的磁盘能力。这个值我建议你设置成磁盘的 IOPS磁盘的 IOPS 可以通过 fio 这个工具来测试,下面的语句是我用来测试磁盘随机读写的命令:

fio -filename=$filename -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=16k -size=500M -numjobs=10 -runtime=10 -group_reporting -name=mytest 


其实,因为没能正确地设置 innodb_io_capacity 参数,而导致的性能问题也比比皆是。之前,就曾有其他公司的开发负责人找我看一个库的性能问题,说 MySQL 的写入速度很慢,TPS 很低,但是数据库主机的 IO 压力并不大。经过一番排查,发现罪魁祸首就是这个参数的设置出了问题。
他的主机磁盘用的是 SSD,但是 innodb_io_capacity 的值设置的是 300。于是,InnoDB 认为这个系统的能力就这么差,所以刷脏页刷得特别慢,甚至比脏页生成的速度还慢,这样就造成了脏页累积,影响了查询和更新性能。
虽然我们现在已经定义了“全力刷脏页”的行为,但平时总不能一直是全力刷吧?毕竟磁盘能力不能只用来刷脏页,还需要服务用户请求。所以接下来,我们就一起看看 InnoDB 怎么控制引擎按照“全力”的百分比来刷脏页。

这个问题可以这么想,如果刷太慢,会出现什么情况?首先是内存脏页太多,其次是 redo log 写满。

所以,InnoDB 的刷盘速度就是要参考这两个因素
一个是脏页比例,
一个是 redo log 写盘速度。

InnoDB 会根据这两个因素先单独算出两个数字。
参数 innodb_max_dirty_pages_pct 是脏页比例上限,默认值是 75%。InnoDB 会根据当前的脏页比例(假设为 M),算出一个范围在 0 到 100 之间的数字

InnoDB 每次写入的日志都有一个序号,当前写入的序号跟 checkpoint 对应的序号之间的差值,我们假设为 N。InnoDB 会根据这个 N 算出一个范围在 0 到 100 之间的数字,这个计算公式可以记为 F2(N)。F2(N) 算法比较复杂,你只要知道 N 越大,算出来的值越大就好了。

InnoDB 会在后台刷脏页,而刷脏页的过程是要将内存页写入磁盘。所以,无论是你的查询语句在需要内存的时候可能要求淘汰一个脏页,还是由于刷脏页的逻辑会占用 IO 资源并可能影响到了你的更新语句,都可能是造成你从业务端感知到 MySQL“抖”了一下的原因。

要尽量避免这种情况,你就要合理地设置 innodb_io_capacity 的值,并且平时要多关注脏页比例,不要让它经常接近 75%

其中,脏页比例是通过 Innodb_buffer_pool_pages_dirty/Innodb_buffer_pool_pages_total 得到的,具体的命令参考下面的代码:

mysql> select VARIABLE_VALUE into @a from global_status where VARIABLE_NAME = 'Innodb_buffer_pool_pages_dirty';
select VARIABLE_VALUE into @b from global_status where VARIABLE_NAME = 'Innodb_buffer_pool_pages_total';
select @a/@b;


一旦一个查询请求需要在执行过程中先 flush 掉一个脏页时,这个查询就可能要比平时慢了。而 MySQL 中的一个机制,可能让你的查询会更慢:在准备刷一个脏页的时候,如果这个数据页旁边的数据页刚好是脏页,就会把这个“邻居”也带着一起刷掉;而且这个把“邻居”拖下水的逻辑还可以继续蔓延,也就是对于每个邻居数据页,如果跟它相邻的数据页也还是脏页的话,也会被放到一起刷。

在 InnoDB 中,innodb_flush_neighbors 参数就是用来控制这个行为的,值为 1 的时候会有上述的“连坐”机制,值为 0 时表示不找邻居,自己刷自己的。

找“邻居”这个优化在机械硬盘时代是很有意义的,可以减少很多随机 IO。机械硬盘的随机 IOPS 一般只有几百,相同的逻辑操作减少随机 IO 就意味着系统性能的大幅度提升。

而如果使用的是 SSD 这类 IOPS 比较高的设备的话,我就建议你把 innodb_flush_neighbors 的值设置成 0。因为这时候 IOPS 往往不是瓶颈,而“只刷自己”,就能更快地执行完必要的刷脏页操作,减少 SQL 语句响应时间。

在 MySQL 8.0 中,innodb_flush_neighbors 参数的默认值已经是 0 了。



分享到:
评论

相关推荐

    MySQL性能优化InnoDB buffer pool flush策略

    这里我们不一一介绍,如果你发现 redo log 推进的非常快,为了避免用户线程陷入刷脏,可以通过调大 innodb_io_capacity_max 来解决,该参数限制了每秒刷新的脏页上限,调 大该值可以增加 Page cleaner 线程每秒的...

    Mysql脏页flush及收缩表空间原理解析

    可以通过参数`innodb_max_dirty_pages_pct`来设置脏页比例的上限,通常默认为75%,调整`innodb_io_capacity`可以控制磁盘I/O能力,从而优化flush策略。 在数据库表空间管理中,删除大量数据并不直接减少磁盘占用,...

    MySQL中读页缓冲区buffer pool.doc

    3. **Flush链表**:保存了已经被修改但还未写回到磁盘的脏页,当满足特定条件(如事务提交、后台线程刷脏页等)时,这些页会被按照 flush 链表的顺序写回到磁盘。 4. **LRU链表**:遵循最近最少使用(LRU)策略,...

    mysql数据库优化

    - 控制InnoDB是否在刷新脏页时也一起刷新邻近的页。 - 取值范围:0(关闭)、1(默认)、2(开启)。 - 对于读密集型应用,建议设置为0以减少不必要的磁盘操作。 3. **innodb_flush_method** - 指定InnoDB如何将...

    BLDC无刷直流电机Simulink双闭环调速系统仿真设计及应用

    内容概要:本文详细介绍了BLDC无刷直流电机在Matlab Simulink环境下的仿真设计,特别是转速和电流双闭环调速系统的实现方法。首先解释了为什么需要进行BLDC电机的仿真设计及其优势,接着简述了Simulink仿真环境的特点和功能。重点在于双闭环调速系统的设计,包括转速外环的PID控制器和电流内环的PWM技术的具体实现方式。最后展示了仿真过程与结果分析,附带简单的代码片段供参考。 适合人群:从事电机控制系统研究的技术人员、高校师生及相关领域的研究人员。 使用场景及目标:适用于希望深入了解BLDC电机控制原理和技术细节的人群,旨在帮助他们掌握基于Simulink平台的BLDC电机建模与仿真的技能。 其他说明:文中提供的代码片段仅为示意,具体实现还需参照完整文档和资料进一步学习。

    实训商业源码-匹饲养养殖场网站模板-毕业设计.zip

    实训商业源码-匹饲养养殖场网站模板-毕业设计.zip

    西门子S7-200SMART恒压供水系统:一对一变频调节与PID控制的全自动解决方案

    内容概要:本文介绍了基于西门子S7-200SMART PLC的恒压供水系统设计方案。该系统采用一对一变频调节,四台主泵与一台辅泵配置,通过PID调节实现自动投切电机和频率调整。系统配有详细的电气图纸和IO点号表,确保安装、调试和维护的便利性。同时,系统集成了西门子触摸屏,提供友好的人机交互界面,便于用户操作和监控。实际工程应用表明,该系统运行稳定,节能效果显著。 适合人群:从事自动化控制系统设计、安装和维护的技术人员,尤其是熟悉西门子PLC和变频器的应用工程师。 使用场景及目标:适用于工业和民用建筑中的恒压供水项目,旨在提高供水系统的稳定性、可靠性和节能效率。 其他说明:文中附有简化的PLC代码示例,展示了如何根据压力变化调整电机状态和频率,为读者提供了实用的参考。

    STM32学习第一课-工程建立

    STM32学习第一课-工程建立

    人力资源分析数据集.rar

    该数据集为结构化人力资源分析数据,涵盖员工全生命周期管理指标,包含员工编号、年龄、部门、职位、教育背景、薪资结构(时薪/日薪/月薪)、绩效评级、培训记录及离职原因等核心字段。数据维度覆盖员工满意度(工作环境、职业发展、工作生活平衡)、任职稳定性(工龄、晋升年限、通勤距离)以及组织效能(部门效能、项目完成量)三大方向,涉及招聘效率、薪酬公平性、人才流失预警等典型人力资源管理场景。 数据采用CSV/XLSX标准化格式存储,包含超过30项可量化指标,包含定量数据(工作时长、薪资数值)与定性指标(满意度评分、离职类型)的混合数据类型。适用于社会科学研究中的人力资本分析、组织行为学模型构建,支持通过Python/Pandas、Tableau等工具开展描述性统计、相关性分析和预测建模。数据集已进行匿名化处理,符合GDPR等数据隐私保护规范,包含完整的数据字典和元数据说明文件。

    中国省市区旅游景点数据.rar

    中国省市区旅游景点数据是以行政区划为单位的全国性旅游资源结构化数据集,覆盖31个省级行政区域(含直辖市、自治区),包含2443条景点信息。数据集包含11个核心字段:城市、景点名称、星级(含4A/5A等级评定)、评分(0-5分游客满意度)、门票价格、销量(门票或游客量)、省/市/区归属、地理坐标(经纬度定位)、简介(含历史文化背景及特色)、是否免费标识、具体地址。数据来源于公开采集的景区官方信息及旅游平台统计,可支持多维分析应用,包括全国景点地理空间分布、游客行为偏好、景区价格体系比较、热门景区客流量预测等研究方向。 该数据集采用Excel格式存储,便于使用Pandas、R等工具进行数据清洗与统计分析,并可通过Pyecharts、Tableau等工具实现可视化呈现。典型应用场景包括:通过坐标字段生成省级热力图,结合销量和评分分析区域旅游经济贡献度,或基于星级和价格字段研究景区评级与消费水平关联性。数据内容已应用于社科领域研究,如《中国A级旅游景区空间分结构研究》等文献,为区域经济规划、文旅政策制定提供基础数据支撑。数据集包含完整字段说明文档,适用于旅游管理、人文地理、区域经济学等学科量化研究。

    论文模板-2022 多个分类随机海量高清壁纸系统源码-实训商业源码.zip

    论文模板-2022 多个分类随机海量高清壁纸系统源码-实训商业源码.zip

    实训商业源码-大气的影视公司网站源码-毕业设计.zip

    实训商业源码-大气的影视公司网站源码-毕业设计.zip

    基于MATLAB的车牌定位算法设计.doc

    基于MATLAB的车牌定位算法设计.doc

    基于Matlab Simulink的双馈风力发电机电网模型及其外扰波形变化研究

    内容概要:本文主要介绍了利用Matlab Simulink平台搭建双馈风力发电机(DFIG)在电网中的模型,并对其在外扰条件下的转矩、功率和电压波形变化进行了深入的研究。首先,文章阐述了双馈风力发电机的基本原理和结构,接着详细描述了如何在Simulink环境中构建DFIG模型并设置相关参数。随后,通过对不同类型的外部干扰进行模拟实验,分析了这些干扰对DFIG各项电气参数的具体影响,如转矩波动、有功无功功率变化以及电压稳定性的改变。最后,作者提供了详尽的技术文档和支持材料来帮助读者进一步理解DFIG的工作机制及其在电力系统中的表现。 适合人群:从事风能发电领域的研究人员和技术人员,特别是那些希望深入了解双馈风力发电机特性和行为的专业人士。 使用场景及目标:适用于想要探索DFIG在复杂电网环境下动态响应特征的研究项目;也可用于指导工程实践中针对DFIG系统的优化设计与故障诊断。 其他说明:文中不仅包含了理论分析,还有大量的实验数据支持,确保研究成果的真实可靠。同时提供的参考资料有助于初学者快速掌握相关知识。

    基因工程(一)基因的结构和基因工程的基本工具.doc

    基因工程(一)基因的结构和基因工程的基本工具.doc

    实训商业源码-App软件落地页网站源码-毕业设计.zip

    实训商业源码-App软件落地页网站源码-毕业设计.zip

    基于遗传算法优化SVM的多输入单输出预测模型及其可视化分析

    内容概要:本文详细介绍了如何利用遗传算法(GA)优化支持向量机(SVM)进行多输入单输出的拟合预测建模。首先,通过sklearn生成模拟数据集并进行预处理,然后采用DEAP库实现遗传算法寻找SVM的最佳超参数(如C和gamma)。接着,使用最佳参数训练SVM模型并对测试集进行预测,最终通过多种图表形式展示预测结果与真实值之间的关系以及误差分布情况,并给出多个性能评估指标。 适合人群:对机器学习尤其是SVM和支持向量回归有一定了解的数据科学家、研究人员和技术爱好者。 使用场景及目标:适用于希望提高SVM模型预测精度的研究人员或从业者,在面对复杂非线性数据时能够自动寻优超参数,减少人工试错成本,提升模型泛化能力。 其他说明:文中提供了完整的代码实现步骤,从数据准备到模型训练再到结果可视化,帮助读者全面掌握整个流程。此外还提到了一些注意事项,比如遗传算法可能存在局部最优解的问题,提醒使用者灵活调整相关参数设置。

    嵌入usb控制器的51系列单片机ez-usb的应用.doc

    嵌入usb控制器的51系列单片机ez-usb的应用.doc

    基于空间矢量控制的永磁同步电机转速系统设计与仿真:MATLAB Simulink平台实现

    内容概要:本文详细介绍了基于空间矢量控制(SVM)的永磁同步电机(PMSM)状态反馈控制转速系统的设计与仿真。首先,文章阐述了永磁同步电机的基本模型及其组成部分,包括电机本体、驱动电路和控制电路。接着,重点讨论了空间矢量控制策略,这是一种能根据电机实时状态调整输入电压幅度和相位的高效控制方法。然后,深入讲解了状态反馈控制机制,即通过实时采集电机的状态信息并计算实际运行状态,与期望状态进行比较,进而得出控制信号以调整电机运行。最后,在MATLAB/Simulink平台上进行了系统建模与仿真,展示了电机在不同负载和输入条件下的性能变化,并通过调整参数和控制策略找到了最优设计方案。 适合人群:电气工程专业学生、电机控制系统研究人员和技术人员。 使用场景及目标:适用于需要深入了解永磁同步电机控制原理的研究人员和技术人员,旨在帮助他们掌握空间矢量控制和状态反馈控制的方法,提升电机运行效率和寿命。 其他说明:文中还提供了一段简短的Simulink模型代码示例,便于读者理解和实践。

    实训商业源码-蓝色营销型五金配件网站源码-毕业设计.zip

    实训商业源码-蓝色营销型五金配件网站源码-毕业设计.zip

Global site tag (gtag.js) - Google Analytics