磁盘IO Hang和磁盘IO高负载演练

磁盘IO Hang和磁盘IO高负载演练一种常见的故障现象,出现IO Hang和IO高负载可能会导致业务性能受损,数据丢失等风险,通过注入IO Hang或IO高负载故障,验证系统在磁盘异常时的告警和恢复情况。

磁盘IO Hang演练

IO Hang是指在进行读或写操作时,系统因为某些原因无法完成这些操作,导致进程或系统无法继续正常工作的一种情况。其可以由多种原因引起,包括硬件故障、驱动问题、文件系统错误、网络延迟或拥塞等。对业务产生性能下降,服务延迟,数据一致性问题等风险。通过此演练场景验证系统在磁盘发生IO Hang时的告警和恢复情况。

使用限制

仅支持Alibaba Cloud Linux 3/2等兼容Cgroup v1的Linux发行版。

实现原理

本方案使用云助手插件ACS-ECS-IoHang,使用Cgroups对磁盘进行限速。其中Cgroups是Linux内核提供的一种可以限制单个或多个进程所使用资源的机制,可以对CPU、内存、IO资源、网络带宽实现精细化的控制。

使用指南

演练准备

故障注入

  1. 登录ECS实例。

    具体操作,请参见通过密码或密钥认证登录Linux实例

  2. 使用具有sudo访问权限的用户,运行云助手插件ACS-ECS-IoHang

    sudo acs-plugin-manager --exec --plugin ACS-ECS-IoHang --params inject,disk=vda,[duartion=paramA]

    []内为可选故障注入参数,参数说明:

    • disk(必选):指定目标磁盘。您可以使用lsblk查看当前系统挂载的磁盘,如需对所有磁盘注入可指定disk=all。

    • duartion(可选):持续时间,单位为秒,默认为300(秒)。

  3. 查看故障注入是否成功。

    • 如显示以下结果,说明故障注入成功。

      image

    • 检查业务读写是否符合预期。

故障恢复

  • 方法一(推荐):等待超时自动恢复。

    说明

    默认300s后会自动退出,对系统盘注入,因场景特殊,可能发生无法自动恢复情况,请在控制台执行强制重启实例,具体操作,请参见重启实例

  • 方法二:仅对数据盘注入,在ECS实例中执行故障恢复命令。

    sudo acs-plugin-manager --exec --plugin ACS-ECS-IoHang --params recover

演练案例

使用lsblk命令查看和选择当前系统挂载的磁盘,以数据盘(vdb)为例,进行故障注入。

  1. 为了更直观地观察演练效果,模拟业务对磁盘vdb读取场景,如有实际业务可跳过。

    sudo dd if=/dev/vdb of=/dev/null

    在iotop命令中查看当前IO占用情况。

    说明

    如未安装iotop工具,可执行以下命令安装。

    • Alibaba Cloud Linux 3/2、CentOS 7

      sudo yum install -y iotop
    • Ubuntu、Debian

      sudo apt install -y iotop

    image

  2. 执行故障注入。

    sudo acs-plugin-manager --exec --plugin ACS-ECS-IoHang --params inject,disk=vdb,duartion=120

    返回如下所示,显示注入参数和指定设备的主设备号和副设备号,表示注入成功。

    image

  3. 查看注入效果。

    查看iotop命令中查看IO占用情况,当前磁盘读取速度已跌至0 B/s。

    image

  4. 等待故障恢复。

    注入超时后,模拟的业务进程速度已恢复。

    image

磁盘IO高负载演练

IO高负载是一种常见的故障现象,导致的原因可能由于过高的业务进程负载,非预期的非业务进程占用,内存资源不足间接导致等情况。出现该情况可能会导致业务性能受损,数据丢失等风险。因此通过此演练场景验证系统在IO高负载时的告警和恢复情况。

实现原理

本方案使用云助手插件ACS-ECS-HighIo,内部使用dd工具(data duplicator)实现复制和转换文件。

  • 对于读模式,先写入一个临时文件到目标路径,通过循环读取对应文件模拟读压力。

  • 对于写模式,通过循环写入模拟写入压力。

使用指南

演练准备

故障注入

  1. 登录ECS实例。

    具体操作,请参见通过密码或密钥认证登录Linux实例

  2. 使用具有sudo访问权限的用户,运行云助手插件ACS-ECS-HighIo

    sudo acs-plugin-manager --exec --plugin ACS-ECS-HighIo --params inject,[model=paramA],[dir=paramB],[bs=paramC],[count=paramD],[duartion=paramE]

    []内为可选故障注入参数,参数说明:

    • model(可选):读/写模式,取值read/write,默认为read。

    • dir(可选):目标路径,通过制定路径来实现对不同磁盘的压力测试,默认为系统根目录。

    • bs(可选):块大小,格式同dd命令中bs块参数格式,用于控制每次读写的块大小,该参数可影响读写速率,为了保证占满IO,默认为1M。

    • count(可选):一次读取循环的块数量,默认为1024。

    • duartion(可选):持续时间,单位秒,默认为300(秒)。

    显示如下所示时,说明云助手插件ACS-ECS-HighIo执行成功。

    image

  3. 执行iotop命令,查看故障注入是否成功。

    显示如下所示时,说明故障注入成功。

    image

故障恢复

在ECS实例中执行故障恢复命令,查看I/O读写是否恢复到故障注入前的水平。

重要

演练完毕后必须执行一次该命令,以删除产生的临时文件。

sudo acs-plugin-manager --exec --plugin ACS-ECS-HighIo --params recover

演练案例

  1. 故障注入:对usr路径进行读取,持续60s。

    sudo acs-plugin-manager --exec --plugin ACS-ECS-HighIo --params inject,dir=/usr,duartion=60

    显示故障注入参数和注入结果,以及存放临时文件的目录文件。

    image

  2. usr目录下,查看当前注入的临时文件,可以看到产生了AliFaultHighio.tmp临时文件。

    image

  3. 执行iotop命令,查看磁盘I/O读写情况。

    image

  4. 执行故障恢复命令。

    sudo acs-plugin-manager --exec --plugin ACS-ECS-HighIo --params recover