java压制cpu执行_RASP研发踩坑之 java agent 执行 attach 时 CPU 飙高

在使用Arthas和JVM-Sandbox等基于Java Agent的技术进行目标JVM attach时,发现会导致CPU负载急剧增加。例如,Arthas attach操作会使CPU从42%升至140.2%,而jvm-sandbox也会引发类似情况。文章通过分析Arthas源码指出,主要涉及rasp-agent.jar和rasp-spy.jar的加载及对象初始化。作者提出疑问:CPU飙升是否与JVM负载有关,以及这种现象的实际影响是什么,并计划进行CPU诊断来深入研究。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主流的基于 Java Agent 技术栈的产品 Arthas和JVM-Sandbox等在执行 attach 到目标 JVM 时都存在 CPU 负载飙高的问题。

测试数据如下

arthas 执行attach 到目标JVM时

75a57d1947bf

arthas 执行attach加载arthas-agent 对JVM cpu 造成的冲击,cpu飙升140%

75a57d1947bf

arthas 执行 attach 瞬间对 JVM cpu 的冲击,cpu由42%飙升到140.2%

jvm-sandbox 执行attach 到目标JVM时

75a57d1947bf

jvm-sandbox 执行 attach 瞬间对 JVM cpu 的冲击,cpu由41.9%飙升到133.3%

疑问1:基于 java-agent attach时存在CPU 飙高的问题,attach 时做了什么?

以 arthas 为例子,来看源码,找寻答案...

private static synchronized InetSocketAddress main(final Map featureMap,final Instrumentation inst) {

final String namespace = getNamespace(featureMap);

final String propertiesFilePath = getPropertiesFilePath(featureMap);

final String coreFeatureString = toFeatureString(featureMap);

try {

// 将Spy注入到BootstrapClassLoader

inst.appendToBootstrapClassLoaderSearch(new JarFile(new File(

getSandboxSpyJarPath(getSandboxHome(featureMap))

// SANDBOX_SPY_JAR_PATH

)));

// 构造自定义的类加载器,尽量减少Sandbox对现有工程的侵蚀

final ClassLoader agentLoader = loadOrDefineClassLoader(

namespace,

getSandboxCoreJarPath(getSandboxHome(featureMap))

// SANDBOX_CORE_JAR_PATH

);

// CoreConfigure类定义

final Class> classOfConfigure = agentLoader.loadClass(CLASS_OF_CORE_CONFIGURE);

// 反序列化成CoreConfigure类实例

final Object objectOfCoreConfigure = classOfConfigure.getMethod("toConfigure", String.class, String.class)

.invoke(null, coreFeatureString, propertiesFilePath);

// CoreServer类定义

final Class> classOfProxyServer = agentLoader.loadClass(CLASS_OF_PROXY_CORE_SERVER);

// 获取CoreServer单例

final Object objectOfCoreServer = classOfProxyServer

.getMethod("getInstance")

.invoke(null);

// CoreServer.isBind()

final boolean isBind = (Boolean) classOfProxyServer.getMethod("isBind").invoke(objectOfCoreServer);

// 如果未绑定,则需要绑定一个地址

if (!isBind) {

try {

classOfProxyServer

.getMethod("bind", classOfConfigure, Instrumentation.class)

.invoke(objectOfCoreServer, objectOfCoreConfigure, inst);

} catch (Throwable t) {

classOfProxyServer.getMethod("destroy").invoke(objectOfCoreServer);

throw t;

}

}

// 返回服务器绑定的地址

return (InetSocketAddress) classOfProxyServer

.getMethod("getLocal")

.invoke(objectOfCoreServer);

} catch (Throwable cause) {

throw new RuntimeException("sandbox attach failed.", cause);

}

}

主要是rasp-agent.jar 和 rasp-spy.jar 的加载和对象的初始化。

从表面上看不到实际的影响是哪些,我们需要对这个过程进行 CPU 诊断...

疑问2:attach 时 CPU 飙高的值是否与JVM负载相关?

多组 QPS 下的压测数据

疑问3:CPU 飙高有什么影响

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值