华为云云数据库rdsRDS for MySQL性能调优-解决I/O高问题_云淘科技

RDS MySQL的I/O性能受硬件层存储介质、软件层数据库内核架构和具体SQL语句(扫描或修改数据量)的影响。本文介绍实例I/O高的原因和解决方案。

高吞吐导致实例I/O高

现象

如果表中有很多索引或大字段,频繁地更新、删除、插入,读取数据和刷新脏页时会有大量的I/O。

您可以在实例监控指标页面查看读写负载情况。

解决方案

建议修改当前实例参数降低读写频率或升级实例规格、优化刷新脏页相关的参数来解决高吞吐问题。和刷新脏页相关的参数如下:

innodb_max_dirty_pages_pct:缓冲池中允许的脏页百分比,默认值为75。

innodb_io_capacity:设置InnoDB后台任务每秒执行的I/O操作数的上限,影响刷新脏页和写入缓冲池的速率。不同磁盘类型默认值不同。

innodb_io_capacity_max:如果刷新操作过于落后,InnoDB可以超过innodb_io_capacity的限制进行刷新,但是不能超过本参数的值。默认值为40000。

临时表导致实例I/O高

现象

如果临时目录很大,可能存在慢SQL排序、去重等操作导致创建很大的临时表。临时表写入也会造成I/O增加。

您可以在实例监控指标页面查看临时表创建情况。

解决方案

在RDS控制台的慢日志页面,下载并查看执行缓慢的SQL,通过分析慢SQL的执行耗时等信息,从而优化SQL。

下载慢日志的操作,请参见查看或下载慢日志。
优化慢SQL的操作,请参见MySQL慢SQL问题定位。

读取冷数据导致实例I/O高

现象

如果SQL查询或修改的数据不在缓冲池(Buffer Pool),则需要从存储中读取,可能会产生大量的I/O吞吐。

您可以在实例监控指标页面查看缓冲池命中率。

解决方案

根据业务场景重新设计缓存策略,或者升级实例规格。

大事务写Binlog导致实例I/O高

现象

事务只有在提交时才会写Binlog文件,如果存在大事务,例如一条Delete语句删除大量的行,可能会产生几十GB的Binlog文件,Binlog文件刷新到磁盘时,会造成很高的I/O吞吐。

解决方案

建议尽量将事务拆分,避免大事务和降低刷新磁盘频率。

InnoDB I/O系统介绍

InnoDB通过一套独立的I/O系统来处理数据页的读取和写入,如果SQL请求的数据页不在Buffer Pool中,会产生物理I/O,需要读写底层存储的数据:

读数据页操作

通过同步I/O实现,同步I/O调用底层的读接口。

写数据页操作

通过异步I/O实现,例如后台线程刷新脏页,后台I/O线程会异步的将脏页刷到磁盘。

除了对普通数据文件的读写I/O操作,写Redo日志、写Undo日志、写Binlog日志、排序临时表、重建DDL表空间等也会造成大量I/O。

父主题: 性能调优

同意关联代理商云淘科技,购买华为云产品更优惠(QQ 78315851)

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家