是否可以使用jmeter来测试grpc

Alo*_*k A 8 jmeter beanshell grpc grpc-java

想知道是否有人尝试过使用 jmeter 来测试 gRPC 应用程序。

我本来希望

  • 我可以编写一个带有非阻塞/异步存根的 gRPC 客户端类,该存根可以对服务器进行非阻塞调用,
  • 创建上述客户端的Jar
  • 将 Jar 导入到 JMeter
  • 在Jmeter BeanShell采样器中使用Java方法

在投入时间尝试上述方法之前,我想看看是否有人尝试过类似的方法

  • 如果以上解决方法有效?
  • 每个线程都会创建一个单独的 TCP 连接吗?

我们已经尝试使用 python 客户端和 locust.io 进行负载测试,但是 python gRPC 与 gevent 不兼容,即使使用异步调用(例如 Stub.GetFeature.future),我们也会达到每个进程每秒请求的限制(异步调用不会似乎是异步的,GIL瓶颈,一旦TCP流)

解决方案:看看https://github.com/whatalokation/whatalokation-grpc-client Readme.md 应该是不言自明的

Kir*_* S. 7

如果以上解决方法有效?

您的解决方案将会起作用。但如果您长期需要它,我建议您实现 自定义 Java Sampler ,而不是使用客户端类和使用 BeanShell 采样器。它非常实用,因为从工作角度来看,它将与实现自定义客户端 + BeanShell 采样器脚本类似/相同,但 Java 采样器通常比 BeanShell 采样器更高效,并且此类解决方案的可维护性会更好(您不会有 2 个 co - 需要维护的依赖组件)。

一个更奇特的选择是创建您自己的JMeter 插件(我在这里提供的链接是旧的,并且不是很准确,但它是一个很好的起点)。这是一项相当大的投资,但如果您发现更简单的解决方案通常可行,但有一些主要限制,或者您需要更高级别的可配置性和控制,那么最终可能是值得的。

每个线程都会创建一个单独的 TCP 连接吗?

每个线程独立运行,但每个线程是否拥有自己的连接将取决于您如何实现它们。在直接实现中(采样器创建和销毁连接),每个线程将有一个单独的 TCP 连接。但 JMeter 具有在线程之间共享的属性,其中可以包含对象。所以你可以通过这种方式在线程之间共享连接。或者您可以实现配置元素,它可以保存一个由所有线程共享的连接池。