是否可以使用jmeter来测试grpc
is it possible to use jmeter to test grpc
想知道是否有人尝试过使用 jmeter 来测试 gRPC 应用程序。
我希望
- 我可以编写一个带有 non-blocking/asynchronous 存根的 gRPC 客户端 class 来对服务器进行非阻塞调用,
- 创建上述客户端的 Jar
- 将 Jar 导入 JMeter
- 使用Jmeter BeanShell采样器中的Java方法
在花时间尝试上述方法之前,我想看看是否有人尝试过类似的东西并且
- 如果上述解决方法有效?
- 每个线程都会创建一个单独的 TCP 连接吗?
我们已经尝试使用 python 客户端和 locust.io 进行负载测试,但是 python gRPC 与 gevent 不兼容,甚至与异步调用也不兼容,例如stub.GetFeature.future,我们正在达到每个进程每秒请求的限制(异步调用似乎不是异步的,GIL 瓶颈,一次 TCP 流)
if above workaround work?
您的解决方案将会奏效。但如果你需要长期使用它,我建议不要让客户端 class 并使用 BeanShell 采样器,实现 custom Java Sampler。这非常实用,因为在工作方面它将 similar/same 作为实现自定义客户端 + BeanShell 采样器脚本,但是 Java 采样器通常比 BeanShell 采样器更有效,并且这种解决方案的可维护性会更好(你不会有 2 个相互依赖的组件需要维护)。
一个更好的选择是创建您自己的 JMeter Plug-in(我在这里提供的 link 是旧的,不是很准确,但它是一个很好的起点)。这是一项相当大的投资,但如果您发现更简单的解决方案通常可行但有一些主要限制,或者您需要更高级别的可配置性和控制,那么最终可能是值得的。
will each thread create a separate TCP connection?
每个线程独立运行,但每个线程是否有自己的连接将取决于您如何实现它们。在直接实现中(采样器创建和销毁连接),每个线程将有一个单独的 TCP 连接。但是JMeter有properties shared among threads, which, among the rest, can contain objects. So you could share a connection between threads that way. Or you can implement configuration element,它可以容纳一个连接池,由所有线程共享。
请参阅 grpc-client java 项目 (maven),该项目使用 JMeter 采样器创建 gRPC 客户端以启用 JMeter 压力测试
使用 maven 构建项目并将生成的 jar 复制到 JMeter lib/ext 文件夹(例如 /usr/local/apache-jmeter-3.1/lib/ext/),以便采样器位于 class路径
之后当您启动 JMeter 时,您应该能够在“java 请求”采样器中看到 classes。
想知道是否有人尝试过使用 jmeter 来测试 gRPC 应用程序。
我希望
- 我可以编写一个带有 non-blocking/asynchronous 存根的 gRPC 客户端 class 来对服务器进行非阻塞调用,
- 创建上述客户端的 Jar
- 将 Jar 导入 JMeter
- 使用Jmeter BeanShell采样器中的Java方法
在花时间尝试上述方法之前,我想看看是否有人尝试过类似的东西并且
- 如果上述解决方法有效?
- 每个线程都会创建一个单独的 TCP 连接吗?
我们已经尝试使用 python 客户端和 locust.io 进行负载测试,但是 python gRPC 与 gevent 不兼容,甚至与异步调用也不兼容,例如stub.GetFeature.future,我们正在达到每个进程每秒请求的限制(异步调用似乎不是异步的,GIL 瓶颈,一次 TCP 流)
if above workaround work?
您的解决方案将会奏效。但如果你需要长期使用它,我建议不要让客户端 class 并使用 BeanShell 采样器,实现 custom Java Sampler。这非常实用,因为在工作方面它将 similar/same 作为实现自定义客户端 + BeanShell 采样器脚本,但是 Java 采样器通常比 BeanShell 采样器更有效,并且这种解决方案的可维护性会更好(你不会有 2 个相互依赖的组件需要维护)。
一个更好的选择是创建您自己的 JMeter Plug-in(我在这里提供的 link 是旧的,不是很准确,但它是一个很好的起点)。这是一项相当大的投资,但如果您发现更简单的解决方案通常可行但有一些主要限制,或者您需要更高级别的可配置性和控制,那么最终可能是值得的。
will each thread create a separate TCP connection?
每个线程独立运行,但每个线程是否有自己的连接将取决于您如何实现它们。在直接实现中(采样器创建和销毁连接),每个线程将有一个单独的 TCP 连接。但是JMeter有properties shared among threads, which, among the rest, can contain objects. So you could share a connection between threads that way. Or you can implement configuration element,它可以容纳一个连接池,由所有线程共享。
请参阅 grpc-client java 项目 (maven),该项目使用 JMeter 采样器创建 gRPC 客户端以启用 JMeter 压力测试
使用 maven 构建项目并将生成的 jar 复制到 JMeter lib/ext 文件夹(例如 /usr/local/apache-jmeter-3.1/lib/ext/),以便采样器位于 class路径
之后当您启动 JMeter 时,您应该能够在“java 请求”采样器中看到 classes。