【问题标题】:Spring reactive poor performance on high load弹簧反应在高负载下性能不佳
【发布时间】:2021-01-27 08:54:17
【问题描述】:

我有一个默认使用 netty 的 spring boot webflux 应用程序。 我们的业务要求之一是请求应在 2 秒内超时。

当向应用发送的请求很少时,一切都很好,但是当请求负载增加时(例如 Jmeter 每秒超过 40 或 50 个并发),有时它们都会超时,因为每个请求都比 2-第二个阈值。

我花了很长时间在网上阅读内容并研究可能导致此问题的原因,但没有成功。当请求同时发送时,大多数最终会花费很长时间,而有问题的部分是向其他微服务发出外部 HTTP 请求的地方。我所有的测试都是本地的,我已经测试了微服务,它们看起来足够快,可以处理大负载,所以微服务本身不是问题。

我知道 netty 使用事件循环并且不会为每个请求创建一个线程。 我相信可能有同步任务阻塞了这几个网络线程。出于这个原因,我进行了大量重构,并在 Mono 反应链中使用了“.publishOn(Schedulers.boundedElastic())”或“.subscribeOn(Schedulers.boundedElastic())”。重构后大部分操作似乎都在弹性线程上运行,而不是“reactor-http-nio-x”(根据日志),但这样做并没有解决主要问题,问题仍然存在。

如果有人能指导我做我应该做的事情,那将是一个巨大的帮助。在这一点上,我没有更多的改进可做,并且认为我可能一直以错误的方式看待这个问题并且我的方法并不正确。

我没有附加任何代码,因为应用程序很大,我仍然不知道实际问题出在哪里。

【问题讨论】:

  • 你找到解决办法了吗?
  • 我们在生产中也遇到了类似的问题,事实证明,主要原因是网络问题导致随机打断导致某些服务调用比平时花费更长的时间。当我发布这个问题时,这是基于本地测试,一切都在本地运行。如此简短的回答是我还没有找到任何解决方案。我可能会尝试 ZZ 5 关于避免使用 webClient 的建议。

标签: spring-boot performance blocking


【解决方案1】:

我也遇到了同样的问题。我没有找到这个问题的根本原因,但是当我从 WebClient 切换到 RestTemplate 每个客户端(外部服务)使用专用线程池时,问题就解决了。我已经运行了一个 blockhound 来查找我是否在流中的某个地方阻塞,但它没有找到任何东西。我还尝试通过增加 NIO 工作线程池的数量(默认情况下它等于核心数)来部署我的应用程序并且有一些改进,但毕竟RestTemplate 产生了最佳性能。所以我还在 Webflux 堆栈上,但我不再使用 WebClient 并且在高负载下的性能很好。

【讨论】:

  • 感谢您的建议。当一切都在本地运行但增加负载时,一些本地服务调用需要很长时间,我在本地环境中也遇到过这个问题。但是,我还没有尝试过不使用 webClient 来查看它的性能。
猜你喜欢
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 2020-01-10
相关资源
最近更新 更多