背景介绍
当 Java 应用响应变慢或出现超时时,其根源可能在于 JVM 内部的执行延迟,例如:长时间的垃圾回收(GC)停顿、激烈的线程锁竞争或耗时的类加载等。本演练模拟这类 JVM 层面的方法执行延迟,帮助您主动发现性能瓶颈,检验应用的超时、重试及熔断机制的有效性,并评估对下游服务的影响。
基本原理
预先在探针管理处将内部自研Agent安装至云主机上,使用管控通道下发动作执行命令。
原理是通过Java Agent在JVM进程内插入sleep代码来模拟方法调用延迟。
故障注入
1、纳管实例资源
导航至 故障演练 > 目标应用 > 应用资源 页面。
在资源类型页签中选择云主机,然后单击添加资源。
在弹出的对话框中,勾选目标云主机实例,单击确定。
2、编排演练任务
导航至 故障演练 > 目标应用 > 演练管理页面,单击新建演练。
在基本信息页面,按提示填写演练名称和描述,然后单击下一步。
在演练对象配置页面:
配置动作组:为动作组命名,资源类型选择云主机。
添加实例:单击添加实例,勾选上一步中添加的云主机实例。
添加故障动作:单击立即添加,在列表中选择JVM延迟动作。
在弹出的参数配置框中,配置所需参数,然后单击确定。
持续时间:故障动作持续时间。
指定类名:目标类的完全限定名,必须是具体的实现类(非接口或抽象类),例如 com.example.service.UserService
指定方法名:相同方法名的方法都会被注入相同故障。例如getUserInfo,结合指定类名参数,表示在UserService 类的 getUserInfo 方法上注入延迟。
方法注入时机:可选在方法执行时注入故障和方法返回前注入故障。
Java进程号:影响的Java进程号,如果同时设置了进程号和进程名,则以进程号优先匹配。
Java进程名:通常是启动命令中的一部分,例如 myApp.jar。
影响的请求条数:限制延迟注入的总生效次数。达到此数目后,后续调用将不再受影响。
影响请求的百分比:用于指定延迟注入生效的概率,取值范围是 1到 100,表示百分比。设置了该参数后,每次调用目标方法时,会根据这个概率来决定是否注入延迟。可以结合影响的请求条数使用,例如设置影响的请求条数为20,影响请求的百分比为30,则表示目标方法的前 20 次调用中,每次调用都有 30% 的概率会注入延迟。
延迟时间(毫秒):方法产生多久的延迟时间。
延迟浮动值(毫秒):在基础延迟时长上的随机浮动范围,用于模拟更真实的网络抖动。最终延迟为 延迟时间 ± 延迟浮动值。
3、配置全局策略
在全局配置页面,按需添加保护策略和监控指标。
配置完成后,单击完成按钮,创建演练任务。
4、发起故障注入
发起演练:在演练管理列表找到对应演练任务,单击操作列的执行演练,在新页面中点击发起新演练。
进入实验:系统将自动跳转到本次演练的运行详情页,或在演练执行记录列表点击对应执行实例的详情进入。
注入故障:在动作组中,找到JVM延迟动作卡片,单击执行。
查看日志:单击动作卡片本身,在右侧弹出的侧边栏中查看执行详情。
效果验证
在故障注入期间,您可以通过以下方式验证演练效果:
1、观测实例指标:
登录应用性能监控控制台,观测已接入应用的应用提供服务平均响应时间指标。
2、业务应用验证:
业务应用日志:检查您的应用日志,确认是否有因处理超时而打印的警告或错误信息。
终端用户体验:直接访问触发了延迟注入功能的前端页面或接口,直观地感受响应时间的变长。
压力测试工具:使用 JMeter 等工具对目标接口进行测试,观察其平均响应时间(Avg Response Time)和吞吐量(TPS)是否出现符合预期的劣化。