io/file/innodb/innodb_data_file
在有正等待来自存储的输入/输出操作的线程时,将发生 io/file/innodb/innodb_data_file
事件。
支持的引擎版本
以下引擎版本支持此等待事件信息:
Aurora MySQL 版本 1,最高 1.23.1
上下文
InnoDB 缓冲池是 Aurora MySQL 在其中缓存表和索引数据的共享内存区域。查询可以直接从内存访问常用的数据,而无需从磁盘读取。事件 io/file/innodb/innodb_data_file
表示处理查询需要进行存储输入/输出操作,因为数据在缓冲池中不可用。
RDS 通常会在执行读取、写入或刷新等输入/输出操作时生成此事件。RDS 在运行数据定义语言 (DDL) 语句时也会生成此事件。发生这种情况的原因是这些语句涉及创建、删除、打开、关闭或重命名 InnoDB 数据文件。
等待次数增加的可能原因
当此事件的发生率超过正常(可能表示性能问题)时,典型原因包括以下几点:
I/O 密集型应用程序工作负载激增可能会增加此等待事件的发生率,因为需要从存储中读取更多查询。
扫描页数的显著增加导致以更快的速度从缓冲池中移出最近最少使用的 (LRU) 页面。低效的查询计划可能会导致问题。由于状态过时、缺少索引或编写的查询效率低下,查询计划可能效率低下。
存储容量已足够,但网络吞吐量超过了实例类的最大带宽,从而导致 I/O 节流。有关不同实例类的网络吞吐量的信息,请参阅 适用于 Aurora 的数据库实例类的硬件规格。
涉及 DDL 语句或读取、插入或修改大量行的事务的操作。例如,批量插入或更新或删除语句可以在
WHERE
子句中指定各种各样的值。扫描大量行的
SELECT
查询。例如,使用BETWEEN
或IN
子句的查询可以指定广泛的数据范围。缓冲池命中率较低,因为缓冲池太小。缓冲池越小,刷新 LRU 页面的频率就越高。这增加了从磁盘读取请求数据的可能性。
操作
根据等待事件的原因,我们建议采取不同的操作。
识别和优化问题查询
从性能详情中找到负责此等待的查询摘要。检查查询的语句执行计划,看看是否可以优化查询,以便在 InnoDB 缓冲池中读取更少的页面。这样可以减少从缓冲池中移出的最近最少使用的页面的数量。这提高了缓冲池的缓存命中效率,从而减轻了输入/输出子系统的负载。
要检查查询的语句执行计划,请运行 EXPLAIN
语句。此命令显示查询执行所涉及的各个步骤。有关更多信息,请参阅 MySQL 文档中的使用 EXPLAIN 优化查询
纵向扩展您的实例
如果您的 io/file/innodb/innodb_data_file
等待事件是由网络或缓冲池容量不足造成的,请考虑将 RDS 实例纵向扩展到更高的实例类类型。
网络吞吐量 – 检查 Amazon CloudWatch 指标
network receive throughput
和network transmit throughput
的值是否增加。如果您的实例已达到实例类的网络带宽限制,请考虑将 RDS 实例纵向扩展到更高的实例类类型。有关更多信息,请参阅适用于 Aurora 的数据库实例类的硬件规格。缓冲池大小 — 检查缓冲池命中率是否较低。要在性能详情中监控此值,请检查
db.Cache.innoDB_buffer_pool_hit_rate.avg
指标。要添加此指标,请选择 Manage metrics(管理指标),然后在 Database metrics(数据库指标)选项卡上的 Cache(缓存)下选择innoDB_buffer_pool_hit_rate
。如果命中率较低,请考虑将 RDS 实例纵向扩展为更高的实例类类型。
注意 控制缓冲池大小的数据库实例参数为
innodb_buffer_pool_size
。您可以修改此参数值,但我们建议您纵向扩展实例类,因为原定设置值已针对每个实例类进行了优化。
使缓冲区对抗扫描
如果您混合使用报告和线上事务处理 (OLTP) 查询,请考虑使缓冲池抵抗扫描。若要执行此操作,请优化参数 innodb_old_blocks_pct
和 innodb_old_blocks_time
。这些参数的影响可能会因实例类硬件、数据和工作负载类型而异。我们强烈建议您在生产环境中设置这些参数之前对系统进行基准测试。有关更多信息,请参阅 MySQL 文档中的使缓冲池抵抗扫描