暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

如何处理MySQL IO Wait比较高的问题

小飞旅馆 2021-08-24
2713

最近公司上的最多的非ORACLE数据库中,MySQL是比重最多的,同时MySQL也是互联网中最流行的数据库。作为一款开源产品,它有来自很多提供商的支持,易于管理且免费,但是由于稳定性不如Oracle,上MySQL也带来很多问题,其中比较常见的就是IO和内存问题。比如IO一般就是磁盘 IOWait 较高,MySQL 服务器表现较高的服务器负载。

 

  • IOWait真的很高吗?

MySQL 负载可能是由于 CPU 使用率高、内存使用率高或 I/O 使用率高。在考虑解决方案之前,重要的是要确保负载确实是由高 I/O 引起的。我们又如何判断呢。

1.在“top”中勾选“%wa”

查看服务器负载的“top”命令输出。如果 CPU 和内存使用较少,即使负载很高,那么磁盘 I/O 将是罪魁祸首。

检查 I/O 等待百分比(%wa 分量)并查看其是否高于 1/n,其中 n 为否。CPU 核心数。如果是这样,则 CPU 等待磁盘 I/O 完成的时间很长。

2.在“iostat”中勾选“iowait%”

看看'iostat'命令的结果,看看'iowait%'是否高。这是 CPU 必须等待磁盘 I/O 请求完成的时间百分比。

还要检查I/O等待高的分区,并确认它在存储数据库的分区中。如果在双核 CPU I/O 等待百分比超过 50%,则认为是高 I/O 等待。

3.iotop或者iostat查看实时的io指标和相应的高消耗进程

iotop查看是哪些进程在频繁的进行IO操作。

 

  • MySQL 高 IOWait 的原因

I/O瓶颈没有单一的原因。它的范围可以从硬件问题到未优化的服务器配置。以下是最重要的问题。

1. 磁盘速度慢或 RAID 阵列降级

由于磁盘访问需要更多的时间并且比访问内存更慢,因此写入和读取操作会降低 MySQL 的性能,尤其是在磁盘速度较慢的情况下。如果磁盘降级或损坏,I/O 等待会增加。

2. 低系统内存

MySQL RAM 中执行其事务时,每次在 RAM 和磁盘之间获取数据。如果 RAM 大小较小,则在处理大型数据库时可能会导致许多 I/O 等待周期。与内存buffer相关的参数一般有innodb_log_file_sizeinnodb_buffer_pool_size

3、交易量大,数据量大

I/O开销可能会进一步增加,具体取决于数据库的大小和事务数。此外,尤其是在大型数据集的插入操作期间,会浪费大量时间,因为写入操作比读取操作慢。

4.未优化的MySQL配置

没有写缓存来存储频繁访问的数据集、不正确的刷新机制、用于执行数据库操作的临时表大小不足等是一些可能导致高 I/O 的问题。比如事务提交相关的参数sync_binloginnodb_flush_log_at_trx_commitinnodb_io_capacityinnodb_io_capacity_max等。

5. 复杂查询

当应用程序中的代码涉及大型数据集中的复杂连接和大范围查询等操作时,内存使用量会增加,所涉及的 I/O 开销也会增加。

  • 解决 MySQL 高 IOWait

根据导致 IOWait 的确切原因,以下是解决高 IOWait 的方法。

1. 将 MyISAM 移至 InnoDB

InnoDB使用自适应刷新算法以高效的方式执行写入操作。InnoDB 记录事务而不是每次都将池刷新到磁盘。这种后台刷新有助于更快地完成查询,从而减少 I/O 峰值。MySQL8开始已经默认用innodb存储引擎了。

2. 主要在非高峰时段执行写事务或者读写分享

计划写入事务可以在非高峰时间执行,例如统计数据编译、报告生成、迁移和复制,同时合理的读写分享也能减少IO等待。

3. 调整 MySQL 参数

1. innodb-flush-log-at-trx-commit——这个参数可以用来控制flush的频率——服务器多久将事务写入磁盘。默认值 1 将日志缓冲区写入日志文件,并在每次事务后将数据从内存刷新到磁盘。此参数可以配置各种选项来控制刷新频率以减少 I/O

2. sync_binlog同样还有sync_binlog,通常的用法是双 1 或者 20(二零),参考官方文档的描述,双 1 在每次提交事务的时候都会刷盘,对 IO 的压力要高不少;20 则是滞后刷盘,对 IO 的压力会较小,因此写入 QPS 会高一些。

 

2. tmp_table_size – 为了执行复杂的连接查询,MySQL 创建一个临时表。如果表大小较小,则操作在磁盘中执行,这会增加 I/O 开销。为了避免这种情况,这个参数被保持在一个较高的值,特别是对于大型数据库。这会分配内存来执行此类操作,从而减少 I/O。此值的计算 = RAM 大小 / 最大连接数。

3.启用缓存——为了最小化I/O,可以在缓冲池中进行缓存,将经常访问的数据和索引保留在内存中。增大缓冲池可以通过减少事务期间所需的磁盘 I/O 量来提高性能。为了控制密钥缓存的大小,MyISAM key_buffer_size 系统变量。innodb_buffer_pool_size 系统变量指定 InnoDB 缓冲池的大小。

4. 改进flush——增加innodb_io_capacity配置选项以执行更频繁的flush,这将避免吞吐量下降。但该值不应太高,否则过多的刷新会降低性能。因此设置了一个最佳值。

5. innodb_log_buffer_size – 大日志缓冲区使大型事务能够运行,而无需在事务提交之前将日志写入磁盘。因此,如果您有更新、插入或删除许多行的事务,则增大日志缓冲区可以节省磁盘 I/O

6. Innodb_buffer_pool_size  - 让更多的数据,尤其是数据库的热数据长期保留在内存中,也是减少IO提高速度的最有效直接方法。

4.优化应用代码

Ø  导致 I/O 等待的应用程序中的慢查询从慢查询日志中识别并优化。

Ø  使用错误索引的查询通过监控其执行时间来识别,并纠正低效查询。

Ø  优化查询和子查询,减少复杂的连接、插入、更新和搜索操作。

5. 硬件升级或迁移

Ø  验证并纠正 RAID 阵列的任何问题

Ø  转移到具有更好磁盘性能的专用服务器或集群(复制解决方案)

Ø  升级硬盘以使用多盘RAID阵列

Ø  使用 SSD 或者 PCIe SSD 设备,至少获得数百倍甚至万倍的 IOPS 提升

Ø  在不同节点之间拆分应用程序(分片)

Ø  安装具有更高 RPM 的磁盘或具有高 IOPS SSD

Ø  升级服务器内存

Ø  根据数据的重要性改变 RAID 级别。例如,将可以重新生成的次重要数据存储在 RAID 0 磁盘上,但将真正重要的数据(例如主机信息和日志)存储在 RAID 0+1 RAID N 磁盘上。由于更新奇偶校验位需要时间,如果您有很多写入,RAID N 可能会成为问题。

 

总之

从硬件问题到未优化的服务器配置,MySQL IOWait 都可能发生。在这里,我们已经介绍了导致 MySQL IOWait 的原因、如何检测它以及修复它的各种方法。


文章转载自小飞旅馆,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论