目录
混沌工程
相比于我们成天担惊受怕系统会出现什么样的问题,还不如提前就模拟线上环境可能出现的各种情况,来看我们的系统是否能做到容错,仍然能继续对外提供服务。当然,我们并不是简单的就在线上环境上面,把机器给断电,或者把网线给拔掉,在混沌工程领域,有一套指导原则,以及标准的实验步骤,具体的可以参考 PRINCIPLES OF CHAOS ENGINEERING 。
Chaos Mesh® 是基于 K8s 的混沌测试平台,而对于部署在物理机上的应用来说,混沌测试同样重要。本文将向大家介绍一款基于 Chaos Mesh®️ 打造的混沌工程测试工具 Chaosd,用于在物理机环境上注入故障,并提供故障恢复功能。
1.Chaosd
Chaosd 是什么?
相信大家对 Chaos Mesh® 已经比较了解了:支持多种类型的混沌实验,有 Dashboard web 界面直接管理实验,TiDB 使用它保障产品质量,还有小鹏汽车、网易、光大银行等众多用户。这么好的工具当然想亲手试一试,动手的时候发现:没有 K8s 环境用不了!
这是因为 Chaos Mesh® 是云原生的混沌工程测试平台,专门为 K8s 设计的。然而你的应用还是用物理机环境部署的,太遗憾了,有故障的时候看告警邮件吧。
请留步,试试 Chaosd?
可能你还是第一次听说 Chaosd,它是 Chaos Mesh® 提供的一款混沌工程测试工具,用于在物理机环境上注入故障,并提供故障恢复功能。看它的名字是不是和 Chaos Mesh® 中的组件 chaos-daemon 比较相似?是的,它正是由 chaos-daemon 演化而来,并针对物理机的特点增加了一些专门的混沌实验功能。
Chaosd 有什么优势
Chaosd 具有以下这些优点:
- 易用性强:输入简单的 Chaosd 命令即可创建混沌实验,并对实验进行管理。
- 故障类型丰富:在物理机的不同层次、不同类型上都提供了故障注入的功能,包括进程、网络、JVM、压力、磁盘、主机等,且更多的功能在不断扩展中。
- 支持多种模式:Chaosd 既可作为命令行工具使用,也可以作为服务使用,满足不同场景的使用需求。
说了这么多,让我们来试一试。最近我们刚发布了 v1.0.1 版本,就用这个版本来简单演示一下。
Chaosd 的使用
1. 下载
首先要下载 Chaosd,执行以下命令:
curl -fsSL -o chaosd-v1.0.1-linux-amd64.tar.gz https://mirrors.chaos-mesh.org/chaosd-v1.0.1-linux-amd64.tar.gz
解压这个文件,可以看到它包含一个 chaosd 文件和一个 tools 文件夹。chaosd 是工具的入口;tools 文件夹下面包含执行混沌实验所需要的一些工具,包括 stress-ng(压力场景)、byteman(JVM 故障)、PortOccupyTool(网络故障占用端口)等。
2. 创建实验
我们以创建一个网络类型的混沌实验为例,注入故障,使服务器无法访问 chaos-mesh.org,执行以下命令:
sudo ./chaosd attack network loss --percent 100 --hostname chaos-mesh.org --device ens33
Attack network successfully, uid: c55a84c5-c181-426b-ae31-99c8d4615dbe
简单来说,这个命令的作用是:通过 ens33 网卡向 chaos-mesh.org 发送或者接收的网络包会 100% 丢失。使用 sudo 是因为该实验会修改网络规则, 需要 root 权限。
此外,别忘了保存好这个实验的 uid,用于后续的实验恢复。
3. 检查实验效果
让我们通过 ping 命令来检查是否可以正常访问 chaos-mesh.org:
ping chaos-mesh.org
PING chaos-mesh.org (185.199.109.153) 56(84) bytes of data.
^C
--- chaos-mesh.org ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1021ms
执行命令后会卡住,迟迟得不到响应,按 CTRL C 退出后可以看到 ping 的统计信息:100% packet loss。说明我们的实验确实生效了。
4. 恢复实验
运行以下命令恢复实验:
sudo ./chaosd recover c55a84c5-c181-426b-ae31-99c8d4615dbe
Recover c55a84c5-c181-426b-ae31-99c8d4615dbe successfully
恢复实验时也会修改网络规则,因此也需要使用 sudo。在执行完成后,可以再 ping chaos-mesh.org 确认网络已经恢复。
后续的规划
提高易用性 & 平台化
从上面的使用示例中可以看到,Chaosd 用起来还是挺简单的,通过命令行就可以创建实验。但是肯定有些人还不太满意:有 Dashboard web 界面能用吗?答案是:目前还没有,但是已经在着手开发了。
我们会继续加强它的易用性,提供 Dashboard web 管理功能,不仅可以管理物理机上 Chaosd 的实验,还可以管理 Chaos Mesh® 上的实验,这样就把物理机环境和 K8s 环境的混沌实验统一管理起来。在去年的 TiDB Hackathon 中我们简单做了一个 demo,架构如下:
详细介绍可以参考 Chaos Mesh® 的 Chaos Engineering as a Service 探索之路。
更多的故障注入功能
目前 Chaosd 提供了进程、网络、JVM、压力、磁盘、主机总共六大故障注入功能,但是仍然需要继续拓展。
_____________________________________________________________________________
2.Chaosblade
download -https://github.com/chaosblade-io/chaosblade/releases
usage:blade create cpu load - chaosblade-help-zh-CN
#异常模拟场景使用说明
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"
}
]
}