IO高负载是一种常见的故障现象,可能由于过高的业务进程负载、非预期的非业务进程占用、内存资源不足等因素导致。IO高负载可能会导致业务性能受损,数据丢失等风险。因此通过此演练场景验证系统在IO高负载时的告警和恢复情况。
实现原理
本方案使用云助手插件ACS-ECS-HighIo,内部使用dd工具(data duplicator)实现复制和转换文件以提高磁盘IO负载,具体说明如下:
-
对于读模式,先写入一个临时文件到目标路径,通过循环读取对应文件模拟读压力。
-
对于写模式,通过循环写入模拟写入压力。
使用指南
演练准备
请确保您的ECS实例已安装云助手Agent,并且云助手状态为正常。具体操作,请参见查看云助手状态及异常状态处理。
故障注入
-
登录ECS实例。
具体操作,请参见使用Workbench登录Linux实例。
-
使用具有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 -
-
执行
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
演练案例
-
故障注入:对
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 -
在
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]$ -
执行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 -
执行故障恢复命令。
sudo acs-plugin-manager --exec --plugin ACS-ECS-HighIo --params recover