扫码阅读
手机扫码阅读
用jmeter-grpc-request性能测试的严重问题

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

TestOps
扫码关注公众号
起因
一位同事在使用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。这是一个小问题,但目前影响不大,先这样修复。
想要了解更多内容?

TestOps
扫码关注公众号
TestOps的其他文章
“测试左移”只要累不死 就卷死别人
不要做测试左移,因为做好了就去QA了,毕竟做啥都清楚了,验收也清楚了还要测试干嘛?难道你要革自己的命?
怎样才算完整的接口自动化测试案例
代码 VS 低(零)代码平台你在公司里开展自动化测试,是使用纯代码的方式还是利用已有的低代码或者零代码平台?
Rust学习笔记(4)-Ownership
OwnershipOwnership是Rust语言所特有的,用于运行时内存管理的一套规则。
Rust学习笔记(2)- Cargo包管理器
在rust中,使用cargo工具来进行包的管理,如果要使用cargo进行包管理,需要使用cargo命令来创建项目
Rust学习笔记(3)- 变量和可变属性
变量和可变属性
变量定义
1
let x = 5;
用let关键字定义
加入社区微信群
与行业大咖零距离交流学习


PMO实践白皮书
白皮书上线
白皮书上线