ChaosBlade Java 场景性能优化,那些你不知道的事

ChaosBlade混沌工程工具 目录 ChaosBlade介绍 使用步骤 blade命令介绍 适用的场景 基础资源类故障 网络类故障 进程类故障 java语言类故障 shell脚本类故障 HTTP类故障 RPC类故障 servlet故障 数据库故障 docker 相关类故障 kubernetes 相关故障 ChaosBlade介绍 ChaosBlade 是阿里巴巴开源的一款遵循混沌工程原理和混沌实验模型的实验注入工具。 定义:混沌工程是一门对系统进行实验的学科,旨在了解系统对应生产环境的各种混乱状况的能力 阅读详情

01

介绍

Aliware

ChaosBlade 是阿里巴巴开源的一款遵循混沌工程原理和混沌实验模型的实验注入工具,帮助企业提升分布式系统的容错能力,并且在企业上云或往云原生系统迁移过程中业务连续性保障。

目前支持的场景有:基础资源、Java 应用、C++ 应用、Docker 容器以及 Kubernetes 平台。该项目将场景按领域实现封装成单独的项目,不仅可以使领域内场景标准化实现,而且非常方便场景水平和垂直扩展,通过遵循混沌实验模型,实现 ChaosBlade cli 统一调用。

不过 Java 场景下的故障注入目前有一些性能问题,主要体现在故障注入时会让 CPU 的使用率大幅度抖动,严重情况下可能会导致 CPU 的使用率 100%。这种情况对于线下服务的影响还好,但是对于线上服务就比较严重了,因为 CPU 的使用率较高有可能会导致服务的整体性能变差,从而影响接口的耗时。

通过对 ChaosBlade Java 场景的性能优化,使 CPU 在故障注入时的抖动得到了有效的控制,不会再出现 CPU 使用率达到 100% 的抖动,经过测试在线上 8C,4G,QPS 3K 左右的服务实例上注入 Dubbo 自定义抛异常的故障,CPU 的使用率可以控制在 40% 左右的瞬时抖动范围内,性能整体提升近 2.5 倍。

本文将会详细的介绍影响性能的问题点以及是如何对这些问题进行优化的。

02

Java 场景

Aliware

在介绍前先了解下 ChaosBlade Java 场景的注入流程。

Java 场景的故障注入是基于字节码增强框架 JVM-Sandbox 实现的,注入一个故障分为两步:

  1. ChaosBlade 执行 prepare 命令,触发 sandbox 对目标 JVM 挂载 Java agent。

  2. ChaosBlade 执行 create 命令,触发 sandbox 对目标 JVM 进行字节码增强,从而达到故障注入的目的。

03

Prepare(挂载)阶段优化

Aliware

01

现象

本地模拟一个简单的 HTTP 服务,控制其 CPU Idle 在 50% 左右,当执行 blade prepare jvm --pid 挂载 agent 后,发现 CPU 空闲率迅速下降,并且下降的幅度较大。在生产中进行故障注入有可能会直接让 Idle 掉低从而触发告警:

02

定位

通过采集 CPU profile 生成火焰图来观察在执行 blade prepare 时 CPU 的使用情况,如下图可以看到 loadPlugins 方法是资源消耗的重灾区。

loadPlugins方法中主要是加载 ChaosBlade Java 中支持的全部插件,例如 dubbo,redis,kafka 等。当加载了这些插件后就可以进行故障注入了。加载插件的过程中会对插件中定义的类以及方法进行字节码增强。

导致 CPU 消耗的问题就在于加载全量的插件耗时较大,而我们故障注入时会选择具体某个插件进行故障注入,显然全量加载并不是最优解

03

优化

优化思路:既然故障注入时会选择具体的插件,那么通过懒加载的方式即可解决,当我们要针对哪一个插件故障注入就加载哪个插件,加载的粒度变小,CPU 的消耗自然就小了:

核心代码:

在故障注入阶段,通过指定的插件进行懒加载。

private void lazyLoadPlugin(ModelSpec modelSpec, Model model) throws ExperimentException {
    PluginLifecycleListener listener = ManagerFactory.getListenerManager().getPluginLifecycleListener();
    if (listener == null) {
        throw new ExperimentException("can get plugin listener");
    }
    PluginBeans pluginBeans = ManagerFactory.getPluginManager().getPlugins(modelSpec.getTarget());
    if (pluginBeans == null) {
        throw new ExperimentException("can get plugin bean");
    }
    if (pluginBeans.isLoad()) {
        return;
    }
    listener.add(pluginBean);
    ManagerFactory.getPluginManager().setLoad(pluginBeans, modelSpec.getTarget());
}

详细代码 PR:

https://github.com/ChaosBlade-io/ChaosBlade-exec-jvm/pull/233

04

改进后效果

CPU Idle 下降幅度降低

火焰图中的 CPU 使用率几乎“消失”

04

Create(注入)阶段优化

Aliware

在实际使用中发现故障注入导致 CPU Idle 跌底的情况比较多,跌底的持续时间是比较短暂的基本都在 20S 左右,有一些情况是和目标服务的业务代码有关系或者是和目标服务的 jvm 参数设置有关,本文只介绍由 ChaosBlade 导致的或间接导致的 CPU Idle 跌底问题。

CPU Idle 跌底:这里指的是 CPU 空闲率降低为 0,同时意味着 CPU 使用率达到了 100%。

01

Dubbo 故障优化

  • 问题描述

ChaosBlade 中支持对 dubbo provider 或者 consumer 进行故障注入(例如抛异常),当一个服务既是 provider 又是 consumer 的时候,如果对 provider 故障注入则会触发 bug,有可能会导致 CPU Idle 跌底。

正常情况:一个既是 provider 又是 consumer 的服务,它的请求处理流程是流量会首先进入到 provider 经过处理后交由业务逻辑执行,最后通过 consumer 将请求转发出去。

针对 consumer 故障注入:当利用 ChaosBlade 对 consumer 进行故障注入时,流量到达 consumer 就会抛出异常,不会将流量真正的转发出去,从而达到一个模拟故障发生的效果。

针对 provider 故障注入:当利用 ChaosBlade 对 provider 进行故障注入时,流量到达 provider 就会抛出异常,不会将流量向下转发。

上面说的都是预期效果,实际上 ChaosBlade 无论是对 provider 或者 consumer 进行故障注入时,都会同时 provider 以及 consumer 同时进行故障注入,这就有可能造成额外的资源浪费。

1. 字节码增强的类变的多了

2. 例如当注入 provider 故障时,我们希望流量不要经过业务逻辑,因为一旦是在 consumer

混沌工程ChaosBlade在微服务上的实践 目录ChaosBlade简介使用文档Demo体验本地编译组建架构场景覆盖图工具使用实战背景介绍network故障实验 ChaosBlade简介 ChaosBlade 是阿里巴巴开源的一款简单易用、功能强大的混沌实验注入工具,提供丰富故障场景实现,可实现底层故障的注入,特点是操作简洁、无侵入、扩展性强。 Chaosblade 是内部 MonkeyKing 对外开源的项目,其建立在阿里巴巴近十年故障... 阅读详情

相关推荐

ChaosBlade源码(一)blade命令行

chaosblade是一个混沌实验实施工具,其组件可以大致分为两部分:1)白屏控制台:chaosblade-box和chaosblade-box-agent;2)黑屏命令行:chaosblade,blade命令行工具,对于不同实验类型底层依赖众多组件,如k8s实验依赖chaosblade-operator,jvm实验依赖chaosblade-exec-jvm;由于官方文档比较匮乏,而chaosblade组件众多,遇到问题难以定位,也难以入手做改造,所以看源码的方式了解一下细节。

2401_87704405的博客 1720

chaosblade-exec-jvm:Chaosblade executor for chaos experiments on Java applications(对 Java 应用实施混沌实验的 chaosblade 执行器)

Chaosblade-exec-jvm:Chaosblade执行器,用于Java应用程序的混乱实验 介绍 该项目是一个基于的chaosblade执行器,用于通过增强类在Java应用程序上进行混沌实验。 演习可以通过cli刀片进行,有关详细信息,请参见项目。 编译中 在项目根目录中,执行以下命令进行编译 make 编译结果将存储在目标目录中。 贡献 我们欢迎您做出的所有贡献,即使只是标点符号。 见的细节 错误和反馈 有关错误报告,问题和讨论,请提交 。 与我们联系: 房: 执照 Chaosblade-exec-jvm已获得Apache许可证2.0版的许可。 有关完整的许可证文本,请参阅 。

ADRV9009的学习历程(一)

** AD9361的同胞ADRV9009 ** 终于记录一下了 距离第一次想写博客记录自己学习的点点滴滴,大概已经过去有一年有余。一直都是停留在心有余而力不足的境界。 基本每次做项目遇到问题都会来优快云寻求帮助,这里虽离庙堂较远,但高手云集。每每读来,思绪万千,次次膜拜。 趁这次又学习了一样新物件,就记录一下,望大神看见能赐教一下。 ADRV9009 最近有项目要用到ADRV9009这个芯片。就来学习一下。做过AD9361的都知道,ADI官方会给出这个芯片的参考手册、数据手册和驱动程序。当然我只是见过AD

weixin_42868560的博客 1万+

自动配胶机的PLC控制系统设计

我们根据自动配胶机的控制需求,编写了相应的PLC程序。PID温度控制算法的实现方面,我们采用了经典的PID控制算法,通过不断调整加热器的功率,实现对胶水混合温度的精确控制。在PLC程序中,我们编写了PID控制算法的程序模块,通过实时采集温度传感器的数据,计算温度偏差和偏差变化率,并根据PID控制算法计算出加热器的功率输出值,实现对温度的精确控制。在系统调试阶段,我们对自动配胶机的各个部分进行了详细的测试和调试,包括气路和液路的开关测试、传感器的精度测试、步进电机的位置和速度测试以及PLC程序的逻辑测试等。

lagougongzuoshi的博客 1228

VMware ESXI 7.0实战:4T硬盘RAID1配置与性能调优全记录

本文详细记录了在VMware ESXI 7.0环境下,为Dell服务器配置两块4T硬盘组建RAID1并进行深度性能调优的全过程。文章重点解析了RAID控制器写入策略(Write-Back with BBU)、读取策略(Read-Ahead)的关键选择,并深入探讨了在ESXI虚拟机层面通过选用PVSCSI控制器、调整虚拟磁盘缓存策略(scsiX:Y.caching)等技巧,以最大化满足数据分析等IO密集型工作负载的需求,最终实现性能的显著提升。

gaochao的博客 259

Cursor 详细使用

Cursor 是一款基于 VSCode 开发的 AI 驱动代码编辑器,集成 GPT-4、Claude3.5 等先进 LLM,具备代码补全、生成、解释、调试等功能,可提升开发效率和代码质量。3. 代码编辑:在编辑区编写代码,利用快捷键提升效率,如 Ctrl+Space 触发智能代码补全、Ctrl+K 润色或修改代码、Ctrl+L 智能问答与代码编辑。3. 代码解释:选中代码,按 Ctrl+L,输入如 “解释这段代码的功能”,Cursor 会给出详细解释。

坚持写博客,大家的关注是我前进的动力! 4818

【已解决】WorkBuddy 国内版与国际版共存 + 关闭自动更新 教程

本文介绍在Windows系统中同时安装并共存WorkBuddy国内版与国际版的完整方案,通过修改product.json文件关闭启动自动更新,修复缓存配置污染问题,确保两版本互不干扰、数据独立。重点解决因共享身份标识导致的更新源错乱、进程锁冲突及自动覆盖风险,提供命令行备份与修改步骤,并强调手动升级时需避免使用应用内更新功能,以规避平台参数错位缺陷。

人生是一场修行 1573

本地部署AI应用:基于Google Gemini的banana-prompt快速上手指南

AI应用开发的核心在于将大模型能力集成到实际场景中,其原理是通过API调用将用户输入转化为模型可理解的指令,再由模型生成响应。这一技术价值在于降低AI应用开发门槛,实现数据本地化处理与隐私保护。在工程实践中,开发者常面临环境配置复杂、API集成繁琐等挑战。本文聚焦于使用banana-prompt工具包,通过TypeScript技术栈和npm包管理,快速在Windows本地部署基于Google Gemini API的AI应用。该方案特别适用于ai-prompts提示词工程和content-creation内容

weixin_27188815的博客 318

MFC Windows 程序设计[105]之彩色滚动条(附源码)

MFC是微软公司提供的一个类库(class libraries),用以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。有很多初学MFC的小伙伴们都觉得MFC比较难学,看书吧,看了就忘了,网上的一些教程又是写的含糊不清,故而学习起来很吃力...... 故此,本专栏亲自研究,实践,由易到难,层层深入,将调试过程中所遭所遇进行详细讲解,注意事项进行一一列举,希望能够帮助到各位初学MFC的小伙伴,避免走弯路,费时费力。

hnjzfwy的博客 520

论文必备 - YOLOv11热力图可视化,支持指定模型,指定显示层,设置置信度,以及10种可视化实现方式

本文带来的是YOLOv11热力图可视化功能,支持,以及。我们经常看到一些论文里绘制了不同的热力图,一方面能够直观的感受其模型的有效性,另一方面也丰富了论文内容。特别是在使用了注意力模块的网络中,热力图就可以验证注意力机制是否真正聚焦到了预期的重要特征上,以便对模型的有效性和合理性进行评估。例如这篇文章中展示的,就很能够表达作者改进后的模型相比之前模型的优越性。

Limiiiing的博客 5505

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: Java核心知识体系:AOP原理和切面应用
下一篇: Java 多线程:基础
java_lujj
博客等级 码龄4年 18粉丝 152原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值