Linux系统磁盘I/O负载较高问题的排查与处理

问题现象

  • 应用服务异常:业务应用性能下降,服务响应超时,或出现与I/O相关的错误日志。

  • 监控指标告警:云监控显示磁盘的%util(使用率)指标接近或持续处于100%,或收到磁盘IOPS、吞吐量超阈值的告警。

问题原因

  • I/O消耗进程:实例内部运行的某个进程(如数据库读写、日志大量写入、备份任务)产生大量磁盘读写请求,占满了磁盘I/O带宽。

  • 磁盘性能瓶颈:当前业务的正常I/O需求超出了实例所挂载云盘的性能上限(IOPS或吞吐量)。

解决方案

使用iostat确认磁盘瓶颈,然后利用iotop定位具体进程,最后按需优化或升级资源。

步骤一:确认磁盘I/O瓶颈

  1. 登录ECS实例。

    1. 访问ECS控制台-实例。在页面左侧顶部,选择目标资源所在的资源组和地域。

    2. 进入目标实例详情页,单击远程连接,选择通过Workbench远程连接。根据页面提示登录,进入终端页面。

  2. 使用iostat监控磁盘I/O状态。

    1. 安装sysstat工具包。

      Alibaba Cloud Linux / CentOS / Fedora

      sudo yum install -y sysstat

      Ubuntu / Debian

      sudo apt install -y sysstat

      openSUSE

      sudo zypper install -y sysstat
    2. 执行iostat,每2秒刷新一次数据。

      iostat -d -x -k 2
  3. 分析iostat输出结果。重点关注:

    • r/sw/s:每秒读、写请求次数(IOPS)。

    • rkB/swkB/s:每秒读、写数据量(吞吐量)。

    • %util:磁盘I/O的使用率。如果持续接近100%,说明磁盘设备已达到饱和状态。

步骤二:定位高I/O消耗进程

磁盘I/O达到饱和状态后,需进一步定位是哪个进程导致的高负载。

  1. 使用iotop实时查看进程的I/O活动。

    1. 安装iotop

      Alibaba Cloud Linux / CentOS / Fedora

      sudo yum install -y iotop

      Ubuntu / Debian

      sudo apt install -y iotop

      openSUSE

      sudo zypper install -y iotop
    2. 显示活跃的I/O进程。

      sudo iotop -o
  2. 分析iotop输出结果。

    • 定位进程:从DISK WRITEDISK READ找出I/O最高的进程。

    • 辅助判断:IO>列显示进程等待I/O的时间占比。

步骤三:分析并处理异常进程

  1. 分析原因:可能源于SQL慢查询、日志级别过高或文件读写频繁等问题。

  2. 处理方法(包括但不限于):

    • 数据库:检查慢查询日志,优化SQL语句和索引。

    • 日志服务:降低应用程序的日志级别(如从DEBUG改为INFO),并配置日志轮转。

    • 文件锁:检查文件读写逻辑。使用内存缓存,增加缓冲区。

步骤四:评估并升级磁盘性能(可选)

如果排查后无法通过应用层优化降低,可以通过升级磁盘来提升性能。

  1. 评估需求:根据iostat监控到的实际IOPS和吞吐量,确定性能目标。

  2. 执行升级:根据性能目标,将云盘升级到更高规格。

后续建议

  • 配置监控告警:为磁盘的%util、IOPS、吞吐量等关键指标配置合理的告警阈值(如80%),实现问题早期发现。

  • 应用I/O优化:在应用层面,尽可能使用缓存减少对磁盘的直接读写。对于写密集的场景,考虑采用异步写入或批量写入的方式,平滑I/O峰值。