全部产品
Search
文档中心

云服务器 ECS:Linux系统磁盘I/O负载较高问题的排查及解决方案

更新时间:Apr 08, 2025

使用Linux实例时,如果遇到实例运行卡顿或文件读写速度较慢等问题,可能是磁盘I/O 负载高导致,您可以参考本文内容排查并解决问题。

问题现象

使用Linux系统的ECS实例时,出现如下现象。

  • 出现系统运行卡顿、文件读写变慢、应用性能下降或内部服务响应慢等问题。

  • 通过ECS控制台查看实例磁盘I/O负载监控时,发现磁盘I/O负载过高(参考值:当前I/O读写≥该云盘I/O性能指标的80%,可认为I/O负载过高)。

  • 收到了磁盘I/O负载超过设定阈值的告警信息。

可能原因

引起磁盘I/O负载过高的常见原因如下:

  • 异常的进程或服务占用大量磁盘I/O,导致磁盘I/O负载过高。

  • 业务程序及业务场景对实例的磁盘I/O负载要求较高,实例的磁盘I/O性能不足以支撑业务开展所需的磁盘I/O性能要求。

解决方案

要定位磁盘I/O负载过高的问题,您可以参见下述操作步骤进行问题的排查定位。

使用iostat查看整体磁盘I/O负载

iostat是一款Linux系统中监控I/O性能的工具,可以查看磁盘整体I/O负载情况。

  1. 执行如下命令,查看系统I/O负载情况。

    sudo iostat -d -m 3 5

    遇到“iostat: command not found” 问题如何处理?

    大多数Linux发行版已预装iostat 工具(通常包含在 sysstat 工具包中),无需手动安装。若未找到该命令,可以执行如下命令安装该工具。

    Alibaba Cloud Linux / CentOS / Fedora

    sudo yum install -y sysstat

    Ubuntu / Debian

    sudo apt install -y sysstat

    openSUSE

    sudo zypper install -y sysstat
    说明
    • -d:仅显示设备统计信息,不显示CPU使用情况。

    • -m:以MB为单位显示。

    • 3:统计时间间隔。

    • 5:统计次数。

    回显结果示例如下。

    Linux 5.10.134-18.al8.x86_64 (iZbpxxxxxxxxxxxxxxxaqhZ)  04/07/2025      _x86_64_        (4 CPU)
    
    Device             tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn
    vda             145.67         0.00       126.81          0        380
    vdb               0.00         0.00         0.00          0          0
    
    Device             tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn
    vda             161.33         0.00       127.24          0        381
    vdb               0.00         0.00         0.00          0          0
    ......

    显示结果中各项参数说明如下。更多参数说明,请运行man iostat查看。

    • Device磁盘名称。

    • tps:每秒I/O请求数。

    • MB_read/s:每秒文件读取速度。

    • MB_wrtn/s:每秒文件写入速度。

    • MB_read:读取的文件大小。

    • MB_wrtn:写入的文件大小。

重要
  • 若检测到磁盘I/O实际性能显著低于阿里云官方公布的块存储服务性能指标,建议您优先检查磁盘分区是否完成4K对齐。通过确认分区对齐状态,可快速定位因对齐配置不当导致的性能损耗问题。

  • 关于块存储性能的更多信息,请参见块存储性能

使用iotop查看进程的磁盘IO负载

iotop是一个用来监视磁盘I/O使用状况的工具,可以查看单个进程的磁盘IO负载。

  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 -P -k -d 3
    说明
    • -P:显示PID。

    • -k:以KB为单位显示。

    • -d:统计时间间隔,单位为秒,默认值为1。

    回显结果示例如下。如需退出程序,请按q键。

    Total DISK READ :       0.00 K/s | Total DISK WRITE :   80373.45 K/s
    Actual DISK READ:       0.00 K/s | Actual DISK WRITE:  127781.85 K/s
        PID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                                                                                                  
      17250 be/4 root        0.00 K/s 80354.87 K/s  0.00 % 95.99 % dd if=/dev/zero of=/mnt/dev_vdb/swap bs=1M count=10240
      15192 be/3 root        0.00 K/s    6.64 K/s  0.00 % 60.56 % [jbd2/vdb1-8]
      17152 be/4 root        0.00 K/s    0.00 K/s  0.00 % 59.55 % [kworker/u8:0
    ......

    关于回显结果的参数说明如下,更多参数说明,可执行iotop -h查询。

    • PID:进程ID。

    • DISK READ:进程读操作的I/O速度。

    • DISK WRITE:进程写操作的I/O速度。

    • SWAPIN:进程等待从交换空间(Swap Space)换入(Swap In)内存页面所占用的 CPU 时间百分比。

    • IO>:进程因 I/O 等待所占用的 CPU 时间百分比(包括 Swap 换入和磁盘 I/O 等待)。

    • COMMAND:进程的命令名称。

说明

如果定位到kjournald进程占用较高磁盘I/O资源,建议修改对应分区的Journal size参数解决该问题。具体操作,请参见kjournald进程占用较高磁盘I/O资源问题处理

处理磁盘I/O负载高的问题

常见磁盘I/O负载高问题原因及解决方案如下。

问题现象

原因

解决方案

异常用户程序或进程长时间占用大量磁盘I/O资源。

该程序为异常程序或进程,运行时占用过多磁盘I/O资源。

通过在iotop工具定位到占用磁盘I/O资源较多的程序的PID,并通过sudo kill -9 <PID>来结束该进程。

警告

在您结束进程前,请务必确保您了解该进程的相关信息,避免因误操作导致您的业务中断。

正常用户程序或进程长时间占用大量磁盘I/O资源。

该程序为正常业务程序或进程,运行时占用过多磁盘I/O资源。

如果云盘出现磁盘I/O性能瓶颈,您可以根据实际情况选择对应的处理方案:

  • 变更云盘类型:当使用SSD云盘出现磁盘I/O瓶颈时,您可以选择更换云盘类型为ESSD,以提升云盘性能。相关操作,请参见变更云盘类型

  • 变更云盘性能级别:当使用ESSD云盘出现磁盘I/O瓶颈时,您可以升级云盘的性能级别。相关操作,请参见修改ESSD云盘性能级别

  • 修改云盘性能配置:当使用ESSD AutoPL云盘出现磁盘I/O瓶颈时,您可以修改云盘性能配置。相关操作,请参见修改ESSD AutoPL云盘性能配置

  • 升级实例规格:当升级云盘规格时,遇到实例规格限制无法升级性能更好的云盘时,您可以先升级实例规格。相关操作,请参见修改实例规格

  • 没有单个程序或进程占用大量磁盘I/O资源。

  • 单个程序或进程偶发磁盘I/O占用过高,但持续时间较短,且发生频率较低。

当前实例的服务正常运行所需磁盘I/O资源性能大于实例的磁盘I/O性能。

常见问题

检查磁盘分区是否完成4K对齐

您可以参考如下操作,以确认当前磁盘设备分区是否完成4k对齐。下述示例中以/dev/vdb1设备分区为例,实际使用中请您根据实际情况替换设备分区名称。

说明

4K对齐是指将分区的起始位置和文件系统的逻辑簇的起始位置与硬盘的物理扇区大小(通常为4KB)进行对齐。以提升磁盘I/O性能。

  1. 运行如下命令,查看设备分区是否4k对齐。

    sudo parted /dev/vdb1 align-check optimal 1

    回显结果示例如下,表明该设备分区已经4K对齐。您可以跳过下述步骤,继续查看处理磁盘I/O负载高的问题

    1 aligned
  2. 如果设备分区没有完成4k对齐,请手动进行处理,具体操作,请参见创建GPT分区时,分区未对齐如何解决

  3. 在完成设备分区4k对齐后,您可以重新查询磁盘I/O读写性能,以确认是否达到阿里云官方公布的块存储服务性能指标。

kjournald进程占用较高磁盘I/O资源问题处理

  • 问题现象:使用iotop排查分析,发现kjournald进程占用了大量磁盘I/O资源。

  • 问题原因:该问题通常是由于ext3文件系统设置的Total Journal size太小导致。

    说明

    kjournald是ext3文件系统的核心日志管理进程,负责执行I/O操作的日志记录与同步。在持续向ext3文件系统执行写入操作时,该进程会不断累加日志占用空间。当预写日志(Journal)的大小达到预先设定的Total Journal Size阈值时,系统将触发强制日志落盘操作。此时,进程会阻塞后续写入请求直至同步完成,可能引发CPU资源争用加剧、内存占用激增及整体I/O性能下降等问题。

  • 解决方案

    • 使用Workbench工具以SSH协议登录Linux实例

    • 执行如下命令,查看相应分区的Journal size大小。下述示例中以/dev/vdb1设备为例,实际使用中请您根据实际情况替换设备名称。

      sudo dumpe2fs /dev/vdb1 | grep -i Journal

      回显结果示例如下,表示/dev/xvda1分区的Total Journal size为64 M。

      dumpe2fs 1.46.0 (29-Jan-2020)
      Filesystem features:      has_journal ext_attr resize_inode dir_index filetype sparse_super large_file
      Journal inode:            8
      Journal backup:           inode blocks
      Journal features:         (none)
      Total journal size:       64M
      Total journal blocks:     16384
      Journal sequence:         0x00000001
      Journal start:            0
    • 执行如下命令,查询该设备当前的挂载信息。

      sudo mount | grep /dev/vdb1

      回显信息示例如下,记录该信息以供后续重新挂载该设备。

      /dev/vdb1 on /mnt/dev_vdb type ext4 (rw,relatime)
    • 执行如下命令,卸载该设备。

      sudo umount /dev/vdb1
      说明

      如果卸载时出现如下报错:umount: /mnt/dev_vdb: target is busy,表明当前设备正在使用,您可以结束等待该设备

    • 执行如下命令,修改Journal size大小为 400 M。您可以结合实际业务场景、块存储设备参数等因素进行综合考虑,以设置合适的Total journal size大小。

      sudo mke2fs -J size=400 /dev/vdb1
    • 修改完成后,运行如下命令,重新挂载该设备。

      sudo mount /dev/vdb1 /mnt/dev_vdb/

相关文档