#异常模拟场景使用说明
1.模拟CPU异常
命令:blade create cpu load [选项参数]
参数:
--timeout string 设定运行时长,单位是秒,通用参数
--cpu-count string 指定 CPU 满载的个数
--cpu-list string 指定 CPU 满载的具体核,核索引从 0 开始 (0-3 or 1,3)
--cpu-percent string 指定 CPU 负载百分比,取值在 0-100
样例:
# 创建 CPU 满载实验
blade create cpu load
# 返回结果如下
{"code":200,"success":true,"result":"beeaaf3a7007031d"}
# code 的值等于 200 说明执行成功,其中 result 的值就是 uid。使用 top 命令验证实验效果
# 4 核都满载,实验生效,销毁实验
blade destroy beeaaf3a7007031d
# 返回结果如下
{"code":200,"success":true,"result":"command: cpu load --help false --debug false"}
# 指定随机两个核满载
blade create cpu load --cpu-count 2
# 使用 top 命令验证结果如下,实验生效
# 指定索引是 0,3 的核满载,核的索引从 0 开始
blade create cpu load --cpu-list 0,3
# 使用 top 命令验证结果如下,实验生效
# 指定索引 1 到 3 的核满载
blade create cpu load --cpu-list 1-3
# 指定百分比负载
blade create cpu load --cpu-percent 60
# 可以看到 CPU 总的使用率达到 60%, 空闲 40%
2.模拟内存使用
命令:blade create mem load [选项参数]
参数:
--mem-percent string 内存使用率,取值是 0 到 100 的整数
--mode string 内存占用模式,有 ram 和 cache 两种,例如 --mode ram。ram 采用代码实现,可控制占用速率,优先推荐此模式;cache 是通过挂载tmpfs实现;默认值是 --mode cache
--reserve string 保留内存的大小,单位是MB,如果 mem-percent 参数存在,则优先使用 mem-percent
--rate string 内存占用速率,单位是 MB/S,仅在 --mode ram 时生效
--timeout string 设定运行时长,单位是秒,通用参数
样例:
# 在执行命令之前,先使用 top 命令查看内存使用信息,如下,总内存大小是 8G,使用了 7.6%
KiB Mem : 7.6/8010196
# 执行内存占用 50%
blade c mem load --mode ram --mem-percent 50
# 查看内存使用
KiB Mem : 50.0/8010196
# 执行内存占用 100%
KiB Mem : 99.6/8010196
# 保留 200M 内存,总内存大小 1G
blade c mem load --mode ram --reserve 200 --rate 100
KiB Mem : 1014744 total, 78368 free, 663660 used, 272716 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 209652 avail Mem
KiB Mem : 79.7/1014744 [|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ]
3.模拟磁盘IO使用
命令: blade create disk burn [选项参数]
参数:
--path string 指定提升磁盘 io 的目录,会作用于其所在的磁盘上,默认值是 /
--read 触发提升磁盘读 IO 负载,会创建 600M 的文件用于读,销毁实验会自动删除
--size string 块大小, 单位是 M, 默认值是 10,一般不需要修改,除非想更大的提高 io 负载
--timeout string 设定运行时长,单位是秒,通用参数
--write 触发提升磁盘写 IO 负载,会根据块大小的值来写入一个文件,比如块大小是 10,则固定的块的数量是 100,则会创建 1000M 的文件,销毁实验会自动删除
样例:
# 在执行实验之前可先观察磁盘 io 读写负载
iostat -x -t 2
# 上述命令会 2 秒刷新一次读写负载数据,截取结果如下
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 2.50 0.00 2.00 0.00 18.00 18.00 0.00 1.25 0.00 1.25 1.25 0.25
# 主要观察 rkB/s、wkB/s、%util 数据。执行磁盘读 IO 负载高场景
blade create disk burn --read --path /home
# 执行 iostat 命令可以看到读负载增大,使用率达 99.9%。执行 blade destroy UID(上述执行实验返回的 result 值)可销毁实验。
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 3.00 223.00 2.00 108512.00 20.00 964.73 11.45 50.82 51.19 10.00 4.44 99.90
# 销毁上述实验后,执行磁盘写 IO 负载高场景
blade create disk burn --write --path /home
# 执行 iostat 命令可以看到写负载增大,使用率达 90.10%。
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 43.00 0.00 260.00 0.00 111572.00 858.25 15.36 59.71 0.00 59.71 3.47 90.10
# 可同时执行读写 IO 负载场景,不指定 path,默认值是 /
blade create disk burn --read --write
# 通过 iostat 命令可以看到,整个磁盘的 io 使用率达到了 100%
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 36.00 229.50 252.50 108512.00 107750.00 897.35 30.09 62.70 53.49 71.07 2.07 100.00
4.模拟磁盘空间填充
命令:blade create disk fill [选项参数]
参数:
--path string 需要填充的目录,默认值是 /
--size string 需要填充的文件大小,单位是 M,取值是整数,例如 --size 1024
--reserve string 保留磁盘大小,单位是MB。取值是不包含单位的正整数,例如 --reserve 1024。如果 size、percent、reserve 参数都存在,优先级是 percent > reserve > size
--percent string 指定磁盘使用率,取值是不带%号的正整数,例如 --percent 80
--retain-handle 是否保留填充
--timeout string 设定运行时长,单位是秒,通用参数
样例:
# 执行实验之前,先看下 /home 所在磁盘的大小
df -h /home
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 4.0G 34G 11% /
# 执行磁盘填充,填充 40G,即达到磁盘满的效果(可用34G)
blade create disk fill --path /home --size 40000
# 返回结果
{"code":200,"success":true,"result":"7a3d53b0e91680d9"}
# 查看磁盘大小
df -h /home
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 40G 0 100% /
# 销毁实验
blade destroy 7a3d53b0e91680d9
{"code":200,"success":true,"result":"command: disk fill --debug false --help false --path /home --size 40000"}
# 查看磁盘大小
df -h /home
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 4.0G 34G 11% /
# 执行按百分比填充磁盘,并且保留填充磁盘的文件句柄
blade c disk fill --path /home --percent 80 --retain-handle
{"code":200,"success":true,"result":"f1fa65e70950d0eb"}
df -h
/dev/vda1 40G 30G 8.1G 79% /
# 查看文件句柄
lsof /home/chaos_filldisk.log.dat
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
chaos_fil 19297 root 3r REG 253,1 17697865728 394174 /home/chaos_filldisk.log.dat
# 执行保留固定大小实验场景
blade c disk fill --path /home --reserve 1024
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 37G 1.1G 98% /
5.模拟网络延迟
命令:blade create network delay [选项参数]
参数:
--destination-ip string 目标 IP. 支持通过子网掩码来指定一个网段的IP地址, 例如 192.168.1.0/24. 则 192.168.1.0~192.168.1.255 都生效。你也可以指定固定的 IP,如 192.168.1.1 或者 192.168.1.1/32,也可以通过都号分隔多个参数,例如 192.168.1.1,192.168.2.1。
--exclude-port string 排除掉的端口,默认会忽略掉通信的对端端口,目的是保留通信可用。可以指定多个,使用逗号分隔或者连接符表示范围,例如 22,8000 或者 8000-8010。 这个参数不能与 --local-port 或者 --remote-port 参数一起使用
--exclude-ip string 排除受影响的 IP,支持通过子网掩码来指定一个网段的IP地址, 例如 192.168.1.0/24. 则 192.168.1.0~192.168.1.255 都生效。你也可以指定固定的 IP,如 192.168.1.1 或者 192.168.1.1/32,也可以通过都号分隔多个参数,例如 192.168.1.1,192.168.2.1。
--interface string 网卡设备,例如 eth0 (必要参数)
--local-port string 本地端口,一般是本机暴露服务的端口。可以指定多个,使用逗号分隔或者连接符表示范围,例如 80,8000-8080
--offset string 延迟时间上下浮动的值, 单位是毫秒
--remote-port string 远程端口,一般是要访问的外部暴露服务的端口。可以指定多个,使用逗号分隔或者连接符表示范围,例如 80,8000-8080
--time string 延迟时间,单位是毫秒 (必要参数)
--force 强制覆盖已有的 tc 规则,请务必在明确之前的规则可覆盖的情况下使用
--ignore-peer-port 针对添加 --exclude-port 参数,报 ss 命令找不到的情况下使用,忽略排除端口
--timeout string 设定运行时长,单位是秒,通用参数
样例:
# 访问本机 8080 和 8081 端口延迟 3 秒,延迟时间上下浮动 1 秒
blade create network delay --time 3000 --offset 1000 --interface eth0 --local-port 8080,8081
{"code":200,"success":true,"result":"9b4aa9fabe073624"}
# 可以在另一台相同网络内的机器通过 telnet 命令验证,即 telnet xxx.xxx.xxx.xxx 8080
# 销毁实验
blade destroy 9b4aa9fabe073624
# 本机访问外部 14.215.177.39 机器(ping www.baidu.com 获取到的 IP)80 端口延迟 3 秒
blade create network delay --time 3000 --interface eth0 --remote-port 80 --destination-ip 14.215.177.39
# 可在本机通过 telnet 14.215.177.39 80 命令验证
# 对整个网卡 eth0 做 5 秒延迟,排除 22 和 8000到8080 端口
blade create network delay --time 5000 --interface eth0 --exclude-port 22,8000-8080
# 会发现 22 端口和 8000 到 8080 端口不受影响,可在另一台相同网络内的机器通过分别 telnet xxx.xxx.xxx.xxx 8080 和 telnet xxx.xxx.xxx.xxx 8081 进行测试
6.模拟网络丢包率
命令: blade create network loss [选项参数]
参数:
--destination-ip string 目标 IP. 支持通过子网掩码来指定一个网段的IP地址, 例如 192.168.1.0/24. 则 192.168.1.0~192.168.1.255 都生效。你也可以指定固定的 IP,如 192.168.1.1 或者 192.168.1.1/32,也可以通过都号分隔多个参数,例如 192.168.1.1,192.168.2.1。
--exclude-port string 排除掉的端口,默认会忽略掉通信的对端端口,目的是保留通信可用。可以指定多个,使用逗号分隔或者连接符表示范围,例如 22,8000 或者 8000-8010。 这个参数不能与 --local-port 或者 --remote-port 参数一起使用
--exclude-ip string 排除受影响的 IP,支持通过子网掩码来指定一个网段的IP地址, 例如 192.168.1.0/24. 则 192.168.1.0~192.168.1.255 都生效。你也可以指定固定的 IP,如 192.168.1.1 或者 192.168.1.1/32,也可以通过都号分隔多个参数,例如 192.168.1.1,192.168.2.1。
--interface string 网卡设备,例如 eth0 (必要参数)
--local-port string 本地端口,一般是本机暴露服务的端口。可以指定多个,使用逗号分隔或者连接符表示范围,例如 80,8000-8080
--percent string 丢包百分比,取值在[0, 100]的正整数 (必要参数)
--remote-port string 远程端口,一般是要访问的外部暴露服务的端口。可以指定多个,使用逗号分隔或者连接符表示范围,例如 80,8000-8080
--force 强制覆盖已有的 tc 规则,请务必在明确之前的规则可覆盖的情况下使用
--ignore-peer-port 针对添加 --exclude-port 参数,报 ss 命令找不到的情况下使用,忽略排除端口
--timeout string 设定运行时长,单位是秒,通用参数
样例:
# 访问本机 8080 和 8081 端口丢包率 70%
blade create network loss --percent 70 --interface eth0 --local-port 8080,8081
{"code":200,"success":true,"result":"b1cea124e2383848"}
# 可以在另一台相同网络内的机器通过 curl 命令验证,即 curl xxx.xxx.xxx.xxx:8080,不使用 telnet 的原因是 telnet 内部有重试机制,影响实验验证。如果将 percent 的值设置为 100,可以使用 telnet 验证。
# 销毁实验
blade destroy b1cea124e2383848
# 本机访问外部 14.215.177.39 机器(ping www.baidu.com 获取到的 IP)80 端口丢包率 100%
blade create network loss --percent 100 --interface eth0 --remote-port 80 --destination-ip 14.215.177.39
# 可在本机通过 curl 14.215.177.39 命令验证,会发现访问不通。执行 curl 14.215.177.38 是通的。
# 对整个网卡 eth0 做 60% 的丢包,排除 22 和 8000到8080 端口
blade create network loss --percent 60 --interface eth0 --exclude-port 22,8000-8080
# 会发现 22 端口和 8000 到 8080 端口不受影响,可在另一台相同网络内的机器通过分别执行多次 curl xxx.xxx.xxx.xxx:8080 和 telnet xxx.xxx.xxx.xxx:8081 进行测试
# 实现整个网卡不可访问,不可访问时间 20 秒。执行完成下面命令后,当前的网络会中断掉,20 秒后恢复。切记!!勿忘 --timeout 参数
blade create network loss --percent 100 --interface eth0 --timeout 20
7.模拟网络包重复发送
命令:blade create network duplicate [选项参数]
参数:
--destination-ip string 目标 IP. 支持通过子网掩码来指定一个网段的IP地址, 例如 192.168.1.0/24. 则 192.168.1.0~192.168.1.255 都生效。你也可以指定固定的 IP,如 192.168.1.1 或者 192.168.1.1/32,也可以通过都号分隔多个参数,例如 192.168.1.1,192.168.2.1。
--exclude-port string 排除掉的端口,默认会忽略掉通信的对端端口,目的是保留通信可用。可以指定多个,使用逗号分隔或者连接符表示范围,例如 22,8000 或者 8000-8010。 这个参数不能与 --local-port 或者 --remote-port 参数一起使用
--exclude-ip string 排除受影响的 IP,支持通过子网掩码来指定一个网段的IP地址, 例如 192.168.1.0/24. 则 192.168.1.0~192.168.1.255 都生效。你也可以指定固定的 IP,如 192.168.1.1 或者 192.168.1.1/32,也可以通过都号分隔多个参数,例如 192.168.1.1,192.168.2.1。
--interface string 网卡设备,例如 eth0 (必要参数)
--local-port string 本地端口,一般是本机暴露服务的端口。可以指定多个,使用逗号分隔或者连接符表示范围,例如 80,8000-8080
--offset string 延迟时间上下浮动的值, 单位是毫秒
--remote-port string 远程端口,一般是要访问的外部暴露服务的端口。可以指定多个,使用逗号分隔或者连接符表示范围,例如 80,8000-8080
--percent 包重复百分比,取值是不带%号的正整数
--force 强制覆盖已有的 tc 规则,请务必在明确之前的规则可覆盖的情况下使用
--ignore-peer-port 针对添加 --exclude-port 参数,报 ss 命令找不到的情况下使用,忽略排除端口
--timeout string 设定运行时长,单位是秒,通用参数
样例:
# 访问指定的 ip 请求包损坏,百分比 80%
blade create network corrupt --percent 80 --destination-ip 180.101.49.12 --interface eth0
ping 180.101.49.12
8.网络包重新排序
命令:blade create network reorder [选项参数]
参数:
--destination-ip string 目标 IP. 支持通过子网掩码来指定一个网段的IP地址, 例如 192.168.1.0/24. 则 192.168.1.0~192.168.1.255 都生效。你也可以指定固定的 IP,如 192.168.1.1 或者 192.168.1.1/32,也可以通过都号分隔多个参数,例如 192.168.1.1,192.168.2.1。
--exclude-port string 排除掉的端口,默认会忽略掉通信的对端端口,目的是保留通信可用。可以指定多个,使用逗号分隔或者连接符表示范围,例如 22,8000 或者 8000-8010。 这个参数不能与 --local-port 或者 --remote-port 参数一起使用
--exclude-ip string 排除受影响的 IP,支持通过子网掩码来指定一个网段的IP地址, 例如 192.168.1.0/24. 则 192.168.1.0~192.168.1.255 都生效。你也可以指定固定的 IP,如 192.168.1.1 或者 192.168.1.1/32,也可以通过都号分隔多个参数,例如 192.168.1.1,192.168.2.1。
--interface string 网卡设备,例如 eth0 (必要参数)
--local-port string 本地端口,一般是本机暴露服务的端口。可以指定多个,使用逗号分隔或者连接符表示范围,例如 80,8000-8080
--offset string 延迟时间上下浮动的值, 单位是毫秒
--remote-port string 远程端口,一般是要访问的外部暴露服务的端口。可以指定多个,使用逗号分隔或者连接符表示范围,例如 80,8000-8080
--correlation string 和上一包的相关性,取值在 0~100,必要参数,例如 --correlation 70
--gap string 包序列大小,取值是正整数,例如 --gap 5
--percent string 立即发送百分比,取值是不带%号的正整数,例如 --percent 50,(必要参数)
--time string 网络包延迟时间,单位是毫秒,默认值是 10,取值时正整数
--force 强制覆盖已有的 tc 规则,请务必在明确之前的规则可覆盖的情况下使用
--ignore-peer-port 针对添加 --exclude-port 参数,报 ss 命令找不到的情况下使用,忽略排除端口
--timeout string 设定运行时长,单位是秒,通用参数
样例:
# 访问指定的 ip 请求包乱序
blade c network reorder --correlation 80 --percent 50 --gap 2 --time 500 --interface eth0 --destination-ip 180.101.49.12
ping 180.101.49.12 -A
8.模拟停止进程
命令:blade create process kill
参数:
--process string 进程关键词,会在整个命令行中查找
--process-cmd string 进程命令,只会在命令中查找
--count string 限制杀掉进程的数量,0 表示无限制
--signal string 指定杀进程的信号量,默认是 9,例如 --signal 15
--timeout string 设定运行时长,单位是秒,通用参数
例子:
# 删除包含 SimpleHTTPServer 关键词的进程
blade create process kill --process SimpleHTTPServer
# 删除 java 进程
blade create process kill --process-cmd java
# 指定信号量和本地端口杀进程
blade c process kill --local-port 8080 --signal 15
# 执行前
netstat -tanp | grep 8080
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 10764/java
# 执行后此进程已不存在
9.模拟进程暂停
命令:blade create process stop [选项参数]
参数:
--process string 进程关键词,会在整个命令行中查找
--process-cmd string 进程命令,只会在命令中查找
--timeout string 设定运行时长,单位是秒,通用参数
样例:
# 暂停包含 SimpleHTTPServer 关键词的进程
blade create process stop --process SimpleHTTPServer
# 暂停 java 进程
blade create process stop --process-cmd java
备注: 查找不到 UID,无法恢复暂停的进程 A:手动执行 kill -CONT PIDS
10.模拟shell 脚本延迟执行
命令:blade create script delay [选项参数]
参数:
--time string 延迟时间,单位是毫秒(必要参数)
--timeout string 设定运行时长,单位是秒,通用参数
--file string 脚本路径(必要参数)
--function-name string 脚本中的函数名(必要参数)
样例:
# blade create script delay --time 10000 --file test.sh --function-name start0
{"code":200,"success":true,"result":"b6a0f477b7fb1f4c"}
# 会在脚本中添加如下命令:
start0() {
sleep 10.000000
...
}
11.模拟脚本函数退出
命令:blade create script exit
参数:
--exit-code string 退出码,默认值是 1
--exit-message string 退出信息
--timeout string 设定运行时长,单位是秒,通用参数
--file string 脚本路径(必要参数)
--function-name string 脚本中的函数名(必要参数)
样例:
# blade create script exit --exit-code 1 --exit-message this-is-error-message --file test.sh --function-name start0
{"code":200,"success":true,"result":"d8a016b96380d7f3"}
# 执行脚本会触发场景。查看脚本修改如下:
start0() {
echo this-is-error-message;exit 1
...
}
12 命令执行状态查询
命令:blade status [选项参数]
参数:
--asc bool 默认值为 false,按 CreateTime 进行降序排序
--limit string 查询实验数目限制,支持 OFFSET 子句,例如:limit 4,3 就表示从位置5开始,返回后3项
--status string 实验状态,create 类型支持 Created|Success|Error|Destroyed 状态,prepare 类型支持 Created|Running|Error|Revoked 状态
--target string 实验目标,例如:dubbo
--type string 命令类型,attach|create|destroy|detach
--uid string prepare 或 experiment 的 uid
-h, --help 查看 create 命令帮助
样例:
# 查看 status 命令帮助文档
blade status -h
# 查询 uid 为 4c6b4a3fc313e1d4 的实验信息
blade status 4c6b4a3fc313e1d4
{
"code": 200,
"success": true,
"result": {
"Uid": "4c6b4a3fc313e1d4",
"Command": "cpu",
"SubCommand": "fullload",
"Flag": " --cpu-percent=60",
"Status": "Destroyed",
"Error": "",
"CreateTime": "2020-01-14T14:09:49.152708+08:00",
"UpdateTime": "2020-01-14T14:10:45.605888+08:00"
}
}
# 查询 create 类型命令的实验信息
blade status --type create
{
"code": 200,
"success": true,
"result": [
{
"Uid": "4c6b4a3fc313e1d4",
"Command": "cpu",
"SubCommand": "fullload",
"Flag": " --cpu-percent=60",
"Status": "Destroyed",
"Error": "",
"CreateTime": "2020-01-14T14:09:49.152708+08:00",
"UpdateTime": "2020-01-14T14:10:45.605888+08:00"
}
]
}
# 查询 prepare 类型命令的实验信息
blade status --type prepare
{
"code": 200,
"success": true,
"result": [
{
"Uid": "e669d57f079a00cc",
"ProgramType": "jvm",
"Process": "dubbo.consumer",
"Port": "59688",
"Status": "Running",
"Error": "",
"CreateTime": "2019-03-29T16:19:37.284579975+08:00",
"UpdateTime": "2019-03-29T17:05:14.183382945+08:00"
}
]
}
以上为常用命令使用方法,详细的使用方法请访问帮助文档: