扫码阅读
手机扫码阅读

用jmeter-grpc-request性能测试的严重问题

932 2023-07-19

我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。

查看原文:用jmeter-grpc-request性能测试的严重问题
文章来源:
TestOps
扫码关注公众号
Article Summary

起因

一位同事在使用jmeter配合jmeter-grpc-request插件进行gRPC接口测试时,遇到了程序卡住的问题。在设置了100个线程后,仅运行5000个请求,jmeter便没有响应,只能强行结束进程。

场景重现

在复现问题时,即使线程数量降至50,jmeter仍迅速无响应。经检查,发现是内存溢出(OutOfMemoryException)所致,这与jmeter默认的1G运行内存显得不匹配。

内存分析

通过分析内存转储文件,发现byte数组和FieldDescriptor对象分别占据了300MB和200MB的内存,共耗费了一半的Heap内存,这指向了程序的内存管理问题。

代码分析

深入分析代码发现,每次gRPC客户端初始化时会创建新的ClientCaller对象。特别是,ProtocInvoker会根据proto文件生成FileDescriptorSet对象,而在多线程压测时,这个过程会重复进行,且由于proto文件众多,导致内存迅速耗尽。

修改插件源码

为了解决内存溢出的问题,将FileDescriptorSet等对象改为单例模式,并修改源码以避免重复读取。经过源码修改和重新编译,测试表明问题得到解决。

不足

由于FileDescriptorSet被改为单例,一旦赋值后将不再更新,这意味着在jmeter中切换测试不同的proto文件需要重启jmeter。这是一个小问题,但目前影响不大,先这样修复。

想要了解更多内容?

查看原文:用jmeter-grpc-request性能测试的严重问题
文章来源:
TestOps
扫码关注公众号