在上一篇文章中,我解释了如何使用 MySQL Shell 收集和绘制指标。
这是一个新系列文章,我将解释如何阅读和理解一些生成的图表。
了解您的工作量并观察其随时间的演变有助于在故障之前预测问题并制定解决方案。
让我们从一个并不总是很好理解或至少不总是考虑其真正价值的概念开始这个系列:MySQL 检查点时代。

InnoDB 检查点
在分析图之前,我们需要了解什么是 MySQL InnoDB Checkpointing。
InnoDB 缓冲池中数据页面的每次更改也会写入预写日志。
在文献中它们有时被称为事务日志,但这个术语在 InnoDB 中并不完全正确。
这些日志仅在崩溃的情况下使用,并且 InnoDB 需要对所有已提交的事务执行恢复。这个过程保证了ACID中的D的耐久性。事务日志也称为重做日志。
但是在某些时候,InnoDB 也会将更改的页面写入表空间(数据文件)中的磁盘。将脏页(已修改的页)写入表空间的过程称为刷新。
检查点表示写入数据文件的最新更改的 LSN 值。
InnoDB 从缓冲池中刷新小批量的脏页,这就是它被称为模糊检查点的原因。MySQL 不会一次全部刷新它们,以避免可能破坏 MySQL 正常使用的繁重进程。
默认情况下,重做日志由 2 个文件ib_logfile0和ib_logfile1. 这些文件包含对 InnoDB 页面所做的更改,但不是InnoDB 页面。
事务日志可以像这样的循环日志表示:

我们知道,当提交修改数据的事务时,更改会写入预写日志(为了持久性而刷新并同步到磁盘)。该写入是在重做日志的头部完成的。这使头部前进。
将缓冲池中的脏页写入表空间的刷新过程将尾部移动到预写日志中的相应数据更改。然后可以重用该空间。尾部和头部只能向前移动(上图中顺时针方向)。
Checkpoint Age是尾部和头部之间的字节长度。
由于它是一个固定大小的循环日志,如果写入速率超过刷新速率,头部可能会到达尾部……这将是一个可怕的问题!
InnoDB 永远不会让这种情况发生!如果这种情况是可能的,那么所有写入都将被阻止!
异步和同步冲洗点
为了避免之前的混乱场景,InnoDB 会在达到某些阈值点时采取行动:
- 异步刷新点:允许写入,但将增加页面刷新以达到其最大容量。这将导致性能下降。
- 同步刷新点:此时所有写入都停止,InnoDB 只会尽可能多地执行页面刷新。糟糕的表现。
在日志文件总大小的75%处达到异步刷新点。同步同步点为87.5%。
结论
现在您知道了监控检查点年龄以避免性能不佳的重要性的原因。

我们可以在这里看到,5 分钟后,检查点年龄非常接近异步刷新点,可能会出现问题。同样,2 分钟后,该检查点的年龄再次增加。
如果您看到(几乎)达到异步点,您需要确定(我们将在本系列的后续文章中看到)是否达到了系统的 I/O 容量,或者您是否有可能增加冲洗速度。
当然,另一种选择是增加重做日志的大小(innodb_log_file_size)。
如果您对 InnoDB 刷新和检查点感兴趣,我建议您阅读Daniel Nichter 的 Efficient MySQL Performance,O’Reilly 2022(从第 205 页开始)。
享受 MySQL 并继续绘制您的 MySQL 性能指标!
原文标题:A graph a day, keeps the doctor away ! – MySQL Checkpoint Age
原文作者:LEFRED
原文地址:https://lefred.be/content/a-graph-a-day-keeps-the-doctor-away-mysql-checkpoint-age/




