spring 启动 netty Web 应用程序的吞吐量
Throughput in spring boot netty web application
我想提高我的网络服务器的吞吐量。
但是我不明白当我用高负载(jmeter)测试它时到底发生了什么。
我 运行 spring 在 8 core
cpu.
的计算机上启动 webflux
应用程序 (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());
}
"Thread.sleep(3000)"
- 这是对同步作品的模仿。
然后我 运行 jmeter tests
有 100 个线程。我只看到吞吐量 2.5 message/sec
。我觉得应该是100左右messages/3 sec
(大约30messages/sec)
所以,我有 2 个问题:
- 为什么吞吐量这么低
- 我该如何管理它
谢谢
你的结果是正确的。你得到 2.5 message/sec 延迟 3 秒(在每个线程中),这给了我们 2.5 * 3 = 7.5 = 8
个核心。 Webflux 默认使用 availableProcessors()
作为处理 network/work IO 的默认线程数。
所以您需要做的是 或移动 Thread.sleep(3000)
块以分隔 ThreadPool/Executor
(这样工作线程就不会被阻塞)或者您的 Thread.sleep(3000)
代码应该以某种非阻塞方式执行 API(例如在 webflux 中你可以使用 Mono.fromCallable
)。
我建议您使用 second/third 方法,因为非阻塞 API 永远不应该被阻塞。
我想提高我的网络服务器的吞吐量。 但是我不明白当我用高负载(jmeter)测试它时到底发生了什么。
我 运行 spring 在 8 core
cpu.
的计算机上启动 webflux
应用程序 (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());
}
"Thread.sleep(3000)"
- 这是对同步作品的模仿。
然后我 运行 jmeter tests
有 100 个线程。我只看到吞吐量 2.5 message/sec
。我觉得应该是100左右messages/3 sec
(大约30messages/sec)
所以,我有 2 个问题:
- 为什么吞吐量这么低
- 我该如何管理它
谢谢
你的结果是正确的。你得到 2.5 message/sec 延迟 3 秒(在每个线程中),这给了我们 2.5 * 3 = 7.5 = 8
个核心。 Webflux 默认使用 availableProcessors()
作为处理 network/work IO 的默认线程数。
所以您需要做的是 Thread.sleep(3000)
块以分隔 ThreadPool/Executor
(这样工作线程就不会被阻塞)或者您的 Thread.sleep(3000)
代码应该以某种非阻塞方式执行 API(例如在 webflux 中你可以使用 Mono.fromCallable
)。
我建议您使用 second/third 方法,因为非阻塞 API 永远不应该被阻塞。