Java spring boot netty web应用程序中的吞吐量
我想提高web服务器的吞吐量。 但是,当我用高负载(jmeter)测试它时,我不明白到底发生了什么 我在一台拥有Java spring boot netty web应用程序中的吞吐量,java,spring,netty,throughput,high-load,Java,Spring,Netty,Throughput,High Load,我想提高web服务器的吞吐量。 但是,当我用高负载(jmeter)测试它时,我不明白到底发生了什么 我在一台拥有8核cpu的计算机上运行spring bootwebflux应用程序(spring boot 2.0.2,netty) 我用以下代码创建了一个简单的控制器: @GetMapping("/test-delay") public Mono<String> testGetWithDelay() throws InterruptedException { Thread.sl
8核cpu的计算机上运行spring bootwebflux
应用程序(spring boot 2.0.2,netty
)
我用以下代码创建了一个简单的控制器:
@GetMapping("/test-delay")
public Mono<String> testGetWithDelay() throws InterruptedException {
Thread.sleep(3000);
return Mono.just("current time:" + LocalDateTime.now());
}
@GetMapping(“/test delay”)
公共Mono testGetWithDelay()抛出InterruptedException{
睡眠(3000);
返回Mono.just(“当前时间:+LocalDateTime.now());
}
“Thread.sleep(3000)”
-它是对同步作品的模仿。
然后我用100个线程运行jmeter测试。我看到的吞吐量只有2.5条消息/秒
。我想应该是每3秒100条左右(大约30条)
因此,我有两个问题:
为什么吞吐量这么低
我该怎么办
谢谢您的结果是正确的。您可以每秒收到2.5条消息,延迟3秒(在每个线程中),这给了我们2.5*3=7.5=8
core。Webflux默认使用可用处理器()
作为处理网络/工作IO的默认线程数
因此,您需要做的是移动线程。sleep(3000)
block来分离线程池/执行器(这样工作线程就不会被阻塞)或线程。sleep(3000)
代码应该在某种非阻塞API中执行(例如在webflux中,您可以使用Mono.fromCallable
)
我建议您使用第二种/第三种方法,因为非阻塞API永远不应该被阻塞。为什么要被阻塞?您在非阻塞服务中有一个阻塞操作,接下来您最多可以处理8个并发任务(实际上这取决于您的CPU体系结构),如果所有任务都在等待,那么在一段时间内不会发生任何事情。通常,当使用反应式方法时,您不会获得更好的性能,但会获得更好的资源利用率,这意味着您可以使用更少的资源来执行阻塞操作。谢谢,@M.Deinum,请给我一个建议,在我的情况下,如何提高吞吐量?mono.delayElement
是否也能达到同样的效果?非常感谢大家!我希望,我明白了主要的意思。我会尝试使用它