servicecomb-java-chassis icon indicating copy to clipboard operation
servicecomb-java-chassis copied to clipboard

bug: metaspace oom

Open five111 opened this issue 4 years ago • 8 comments

##【SCB-2372】

触发场景

servicecomb 会在调用之初为服务创建配置类,大量调用未注册的服务, 由于服务未注册,每次调用都会去创建类,一定数量之后会导致metaspace oom

five111 avatar Jan 13 '22 06:01 five111

可以稳定的重现这个问题吗?是否可以提供简单的重现代码片段和过程。

liubao68 avatar Jan 14 '22 02:01 liubao68

可以稳定重现 复现手段

jmeter+微服务A
微服务A发送请求给微服务B,且环境没有微服务B,然后用jmeter发送大量请求给微服务A 请求如下 无特殊之处

@GetMapping("/asyncSayHello/{name}")
    public String asyncSayHello(@PathVariable("name") String name) {
        cseAsyncRestTemplate.getForEntity("cse://TOF-provider/provider/tomcat/hello/" + name, String.class);
        return null;
    }

通过visualVM观察metaspace如下图 image 虽然能看到gc回收 单如果我将metaspace大小设置较小 很容易oom 比如 我服务启动后metaspace稳定在40m 我将maxmetaspace设置为60m这样就很容易触发oom了

five111 avatar Jan 14 '22 03:01 five111

建议是在ConfigObjectFactory类做一层缓存 每个微服务无论调用成功失败 都只加载1次

five111 avatar Jan 14 '22 03:01 five111

你描述的应该是jmeter调用微服务A吧? 写成了 “用jmeter发送大量请求给微服务B"。 另外, 记得历史上有修复过这个问题。 你用的版本是什么?

liubao68 avatar Jan 14 '22 03:01 liubao68

你描述的应该是jmeter调用微服务A吧? 写成了 “用jmeter发送大量请求给微服务B"。 另外, 记得历史上有修复过这个问题。 你用的版本是什么?

是调用微服务A 写错了 版本是2.1.5 ConfigObjectFactory类的doCreate这个方法在问题场景下会被反复执行,这个方法又会创建类 导致的问题 2.6.0版本doCreate这个方法被改成了createProperties方法,实现应该没有变化 如果整个调用过程的逻辑顺序没用变化的话 问题应该还是存在的 你说的已经解决的问题是否是这个 https://github.com/apache/servicecomb-java-chassis/pull/2320/files

five111 avatar Jan 14 '22 04:01 five111

应该是的。 2.6.0也能重现这个问题吗?

liubao68 avatar Mar 24 '22 12:03 liubao68

稍后几天 我可以拿最新社区代码做一次测试 如果复现的话 我会将自己在2.1.5版本做的修改提交至社区

five111 avatar Mar 24 '22 12:03 five111

@five111 Any updates?

liubao68 avatar Apr 13 '22 01:04 liubao68