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 个问题:

  1. 为什么吞吐量这么低
  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 永远不应该被阻塞。