一、背景
高并发情况下,我们的进程表现会怎样? 网络延迟情况下,会对我们的程序造成什么影响? 假设磁盘满了, 我们的程序又会怎么样? OOM情况、CPU高负载情况等等。
我们日常开发和运维过程中,希望能够通过某种模拟故障的手段,通过制定的压测、故障注入、故障演练机制, 提前预判可能会出现的极端问题从而制定出解决方案,那么真的有那么一天的时候,也无需紧张,直接按照处理方案进行即可。 提高了我们系统的可靠性以及应对突发情况的处理能力。
那在专业领域来说,这个过程有个专业术语,此类工程称为"混沌工程"。 混沌工程的定义大致如下:
混沌工程是通过主动制造故障场景并根据系统在各种压力下的行为表现确定优化策略的一种系统稳定性保障手段,简单说就是通过主动注入故障的方式、提前发现问题,然后解决问题规避风险。
关于混沌工程这个话题太大,其实也算分到软件测试领域的一种,这里不细说。
"工欲善其事必先利其器" 。 那像我前面提到的, 可以混沌工程的工具有哪些呢? 例如怎么模拟Java进程OOM、怎么模拟Java进程CPU使用率过高, 以至于在云原生领域, 怎么模拟Pod的内存、CPU、网络等相关故障呢? 那必然存在这么一些混沌工程的工具。
最近正巧有遇到这种混沌工程的场景, 我们选择的就是开源的Chaosblade, 今天文章的主角。
二、Chaosblade介绍
1、什么是Chaosblade ?
Chaosblade, 阿里巴巴开源的一款简单易用、功能强大的混沌实验注入工具。ChaosBlade是一个云原生混沌工程平台,支持多种环境、集群和语言。
包含混沌工程实验工具 chaosblade 和混沌工程平台 chaosblade-box,旨在通过混沌工程帮助企业解决云原生过程中高可用问题。
github地址: https://github.com/chaosblade-io/chaosblade
官网地址: https://chaosblade.io/
2、Chaosblade支持的故障注入/试验场景
1、系统资源类
CPU:可以模拟CPU高负载情况。
内存:能够模拟内存占用过高或内存泄露的情况。
磁盘:可以创建磁盘空间不足、I/O延迟等场景。
2、网络类
可以模拟网络延迟、丢包、带宽限制等网络故障。
还支持DNS解析失败等网络相关问题的模拟。
3、进程与服务类
可以模拟服务响应慢、服务不可用等场景。
支持对特定进程的CPU、内存使用进行限制。
4、数据库类
能够模拟数据库连接超时、查询慢等问题。
5、中间件类(JVM等)
支持模拟消息队列、缓存服务等中间件的异常情况。
6、容器及Kubernetes类
在Kubernetes环境中,可以模拟Pod重启、节点宕机等场景。
7、API调用类
模拟API请求失败、响应时间过长等场景。
8、文件系统类
可以模拟文件读写错误、权限问题等。
通过这些试验场景,开发者和运维人员可以在安全可控的环境下,测试和验证系统的健壮性,提前发现潜在的问题,并采取措施加以改进。如果您有具体的试验需求,可以根据上述类别选择合适的试验场景来执行。
三、实操JVM内存和CPU使用率过高的故障注入
1、JVM OOM内存故障注入
1、首先arthas查看目标java进程的jvm指标情况正常
2、执行blade指令,模拟OOM内存故障
3、arthas再次观察到内存OOM, 且进程失去了响应
2、JVM CPU使用率过高
1、top查看java进程CPU使用率,正常
2、 执行blade指令,模拟CPU使用率过高
3、再次top查看进程CPU使用率,已超过200%
四、总结
混沌工程的Chaosblade开源工具,可以帮助我们模拟一些预设的故障, 之后针对这些故障我们如何应对? 如何优化程序, 或者如何避免因为这些故障而导致系统产生不可用的情况。 从而提高整个系统的SLA可用率。