【问题标题】:Throughput in spring boot netty web applicationSpring Boot Netty Web 应用程序中的吞吐量
【发布时间】:2018-10-26 00:50:50
【问题描述】:

我想提高我的网络服务器的吞吐量。 但是我不明白当我用高负载(jmeter)测试它时到底发生了什么。

我在带有8 core cpu 的计算机上运行spring boot webflux app (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)" - 仿同步作品。 然后我用 100 个线程运行 jmeter tests。我只看到吞吐量2.5 message/sec。我认为应该是大约 100 个messages/3 sec(大约 30 条消息/秒)

所以,我有两个问题:

  1. 为什么吞吐量这么低
  2. 我该如何管理它

谢谢

【问题讨论】:

  • 为什么要这样?您在非阻塞服务中有一个阻塞操作,接下来您最多可以处理 8 个并发任务(实际上这取决于您的 CPU 架构),如果它们都在等待一段时间内什么都不会发生。通常,在使用响应式方法时,您不会获得更好的性能,但会获得更好的资源利用率,这意味着您可以使用更少的资源来完成与阻塞操作相同的操作。
  • 谢谢,@M.Deinum 请给我一个建议,在我的情况下如何提高吞吐量?

标签: java spring netty throughput high-load


【解决方案1】:

您的结果是正确的。你得到 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。

【讨论】:

  • mono.delayElement 不会也达到同样的效果吗?
  • 非常感谢,伙计们!我希望,我理解了主要思想。我会尝试使用它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-28
相关资源
最近更新 更多