spring boot netty web application

时间:2018-05-16 05:14:10

标签: java spring netty throughput high-load

我想提高网络服务器的吞吐量。 但是当我用高负荷(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条消息/秒)

所以,我有两个问题:

  1. 为什么吞吐量如此之低
  2. 我该如何管理
  3. 由于

1 个答案:

答案 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。