磁盘IO高负载演练

更新时间:
复制为 MD 格式

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

实现原理

本方案使用云助手插件ACS-ECS-HighIo,内部使用dd工具(data duplicator)实现复制和转换文件以提高磁盘IO负载,具体说明如下:

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

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

使用指南

演练准备

请确保您的ECS实例已安装云助手Agent,并且云助手状态正常。具体操作,请参见查看云助手状态及异常状态处理

故障注入

  1. 登录ECS实例。

    具体操作,请参见使用Workbench登录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],[duration=paramE]

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

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

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

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

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

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

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

    [ecs-user@iZ0jl5pl6qr9          ~]$ sudo acs-plugin-manager --exec --plugin ACS-ECS-HighIo --params inject
    params: model-read, dir=/, bs=1M, count=1024, duration=300
    Done
    /usr/local/share/aliyun-assist/plugin/ACS-ECS-HighIo/TMP_FILE_PATH.tmp
  3. 执行iotop命令,查看故障注入是否成功。

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

    Total DISK READ :      105.85 M/s | Total DISK WRITE :        0.00 B/s
    Actual DISK READ:      105.85 M/s | Actual DISK WRITE:        0.00 B/s
      TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
     3270 be/4 root       105.85 M/s    0.00 B/s  0.00 % 99.16 % dd if=//AliFaultHighio.tmp of=/dev/null bs=1M count=1024 iflag=dsync,direct,fullblock
        1 be/4 root         0.00 B/s    0.00 B/s  0.00 %  0.00 % init noibrs splash
        2 be/4 root         0.00 B/s    0.00 B/s  0.00 %  0.00 % [kthreadd]
        4 be/0 root         0.00 B/s    0.00 B/s  0.00 %  0.00 % [kworker/0:0H]
        6 be/4 root         0.00 B/s    0.00 B/s  0.00 %  0.00 % [mm_percpu_wq]
        7 be/4 root         0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/0]
        8 be/4 root         0.00 B/s    0.00 B/s  0.00 %  0.00 % [rcu_sched]
        9 be/4 root         0.00 B/s    0.00 B/s  0.00 %  0.00 % [rcu_bh]
       10 rt/4 root         0.00 B/s    0.00 B/s  0.00 %  0.00 % [migration/0]
       11 rt/4 root         0.00 B/s    0.00 B/s  0.00 %  0.00 % [watchdog/0]
       12 be/4 root         0.00 B/s    0.00 B/s  0.00 %  0.00 % [cpuhp/0]
       13 be/4 root         0.00 B/s    0.00 B/s  0.00 %  0.00 % [cpuhp/1]
       14 rt/4 root         0.00 B/s    0.00 B/s  0.00 %  0.00 % [watchdog/1]
       15 rt/4 root         0.00 B/s    0.00 B/s  0.00 %  0.00 % [migration/1]
       16 be/4 root         0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/1]
       17 be/4 root         0.00 B/s    0.00 B/s  0.00 %  0.00 % [kworker/1:0]
       18 be/0 root         0.00 B/s    0.00 B/s  0.00 %  0.00 % [kworker/1:0H]
       19 be/4 root         0.00 B/s    0.00 B/s  0.00 %  0.00 % [kdevtmpfs]
       20 be/0 root         0.00 B/s    0.00 B/s  0.00 %  0.00 % [netns]
       21 be/4 root         0.00 B/s    0.00 B/s  0.00 %  0.00 % [rcu_tasks_kthre]

故障恢复

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,duration=60

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

    [ecs-user@iZ0jl5pl6qr9ecxxx ~]$ sudo acs-plugin-manager --exec --plugin ACS-ECS-HighIo --params inject,dir=/usr,duration=60
    params: model=read, dir=/usr, bs=1M, count=1024, duration=60
    Done
    /usr/local/share/aliyun-assist/plugin/ACS-ECS-HighIo/TMP_FILE_PATH.tmp
  2. usr目录下,查看当前注入的临时文件,可以看到产生了AliFaultHighio.tmp临时文件。

    [ecs-user@iZ2zeioazo         ~]$ cd /usr
    [ecs-user@iZ2zeioazo         usr]$ ll
    total 512128
    -rw-r--r--.  1 root root 524288000 Jul 31 10:38 AliFaultHighio.tmp
    dr-xr-xr-x.  2 root root     32768 May 28 11:17 bin
    drwxr-xr-x.  2 root root      4096 Feb  9  2022 games
    drwxr-xr-x. 35 root root      4096 May 28 11:16 include
    dr-xr-xr-x. 35 root root      4096 May 28 11:08 lib
    dr-xr-xr-x. 49 root root     36864 May 28 11:16 lib64
    drwxr-xr-x. 30 root root      4096 May 28 11:13 libexec
    drwxr-xr-x. 14 root root      4096 May 28 11:13 local
    dr-xr-xr-x.  2 root root     20480 Jul 31 10:27 sbin
    dr-xr-xr-x. 94 root root      4096 May 28 11:16 share
    drwxr-xr-x.  4 root root      4096 May 28 11:00 src
    lrwxrwxrwx.  1 root root        10 Feb  9  2022 tmp -> ./var/tmp
    [ecs-user@iZ2zeioazolicrtw3ow42bZ usr]$
  3. 执行iotop命令,查看磁盘I/O读写情况。

    Total DISK READ :   106.05 M/s | Total DISK WRITE :       0.00 B/s
    Actual DISK READ:   106.05 M/s | Actual DISK WRITE:      31.72 K/s
      TID  PRIO  USER     DISK READ  DISK WRITE>  COMMAND
      365 be/3 root        0.00 B/s    0.00 B/s [jbd2/vda3-8]
     3443 be/4 root      106.05 M/s    0.00 B/s dd if=/usr/AliFaultHighio.tmp of=/dev/null bs=1M count=1024 iflag=dsync,direct,fullblock
  4. 执行故障恢复命令。

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