磁盘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资源、网络带宽实现精细化的控制。
使用指南
演练准备
请确保您的ECS实例已安装云助手Agent,并且云助手状态为正常。具体操作,请参见查看云助手状态及异常状态处理。
故障注入
登录ECS实例。
具体操作,请参见通过密码或密钥认证登录Linux实例。
使用具有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(秒)。
查看故障注入是否成功。
如显示以下结果,说明故障注入成功。
检查业务读写是否符合预期。
故障恢复
方法一(推荐):等待超时自动恢复。
说明默认300s后会自动退出,对系统盘注入,因场景特殊,可能发生无法自动恢复情况,请在控制台执行强制重启实例,具体操作,请参见重启实例。
方法二:仅对数据盘注入,在ECS实例中执行故障恢复命令。
sudo acs-plugin-manager --exec --plugin ACS-ECS-IoHang --params recover
演练案例
使用lsblk
命令查看和选择当前系统挂载的磁盘,以数据盘(vdb)为例,进行故障注入。
为了更直观地观察演练效果,模拟业务对磁盘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
执行故障注入。
sudo acs-plugin-manager --exec --plugin ACS-ECS-IoHang --params inject,disk=vdb,duartion=120
返回如下所示,显示注入参数和指定设备的主设备号和副设备号,表示注入成功。
查看注入效果。
查看iotop命令中查看IO占用情况,当前磁盘读取速度已跌至0 B/s。
等待故障恢复。
注入超时后,模拟的业务进程速度已恢复。
磁盘IO高负载演练
IO高负载是一种常见的故障现象,导致的原因可能由于过高的业务进程负载,非预期的非业务进程占用,内存资源不足间接导致等情况。出现该情况可能会导致业务性能受损,数据丢失等风险。因此通过此演练场景验证系统在IO高负载时的告警和恢复情况。
实现原理
本方案使用云助手插件ACS-ECS-HighIo
,内部使用dd工具(data duplicator)实现复制和转换文件。
对于读模式,先写入一个临时文件到目标路径,通过循环读取对应文件模拟读压力。
对于写模式,通过循环写入模拟写入压力。
使用指南
演练准备
请确保您的ECS实例已安装云助手Agent,并且云助手状态为正常。具体操作,请参见查看云助手状态及异常状态处理。
故障注入
登录ECS实例。
具体操作,请参见通过密码或密钥认证登录Linux实例。
使用具有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
执行成功。执行
iotop
命令,查看故障注入是否成功。显示如下所示时,说明故障注入成功。
故障恢复
在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,duartion=60
显示故障注入参数和注入结果,以及存放临时文件的目录文件。
在
usr
目录下,查看当前注入的临时文件,可以看到产生了AliFaultHighio.tmp
临时文件。执行iotop命令,查看磁盘I/O读写情况。
执行故障恢复命令。
sudo acs-plugin-manager --exec --plugin ACS-ECS-HighIo --params recover