我想提高网络服务器的吞吐量。 但是当我用高负荷(jmeter)进行测试时,我不明白究竟发生了什么。
我在webflux
cpu的计算机上运行spring boot spring boot 2.0.2, netty
app(8 core
)。
我用这段代码创建了一个简单的控制器:
@GetMapping("/test-delay")
public Mono<String> testGetWithDelay() throws InterruptedException {
Thread.sleep(3000);
return Mono.just("current time:" + LocalDateTime.now());
}
"Thread.sleep(3000)"
- 它是对同步作品的模仿。
然后我用100个线程运行jmeter tests
。我只看到2.5 message/sec
的吞吐量。我认为它应该是大约100 messages/3 sec
(约30条消息/秒)
所以,我有两个问题:
由于
答案 0 :(得分:3)
您的结果是正确的。你得到2.5消息/秒,延迟3秒(在每个线程中),这给了我们2.5 * 3 = 7.5 = 8
个核心。 Webflux默认使用availableProcessors()
作为处理网络/工作IO的默认线程数。
所以你需要做的是increase the number of processing threads或移动Thread.sleep(3000)
阻止ThreadPool/Executor
(因此工作线程没有被阻止)或者你的Thread.sleep(3000)
代码应该被执行在某种非阻塞API中(例如在webflux中,您可以使用Mono.fromCallable
)。
我建议您使用第二种/第三种方法,因为永远不会阻止非阻塞API。