WebFlux WebClient 性能不会触及 CPU 的最大值

问题描述

我正在编写一个网络密集型 WebFlux 应用程序。 当收到请求时,应用程序向另一个外部服务器请求和接收一些东西,然后回复原始请求者。 我说的是 WebFlux 应用程序,我在调用外部服务器时使用 WebClient。

应用程序的性能不是那么令人满意。 我认为它应该触及最大 cpu 资源,最大 cpu 时的最大 TPS。 但它显示出低 tps,cpu 仅为 30 或 40%。 为什么它不再使用 cpu 来获得更多 TPS,即使它有更多空间来执行更多请求。

我将它与没有外部调用(WebClient)的任务进行了比较,它在最大 cpu 资源使用率下显示了完整的 TPS。

====

示例代码https://github.com/mouse500/perfwebf

perfwebf WebClient 性能示例项目

/workloadwexcall : 使用外部调用的工作负载

/workloadwoexcall : 仅使用 cpu 作业的工作负载(但有 1 毫秒延迟)

外部调用是通过内部的简单节点服务器实现的 prj 包括一切。

您可以构建 Dockerfile 并使用 docker 运行

准备jmeter什么的,

test1 : 使用超过 200 个线程调用 /workloadwexcall api => 在 perfwebf 服务器上显示 30~40% 的 cpu 水平

test2 : 使用超过 200 个线程调用 /workloadwoexcall api => 在带有 m 的 perfwebf 服务器上显示几乎 100% 的 cpu 水平

======

到目前为止的观察,

我在 AWS EC2(8 核,16 G 内存)上进行了测试,

我认为外部服务器足够简单和强大,可以做出反应

当测试1时,

服务器的大量线程等待

{
  "threadName": "reactor-http-epoll-3","threadId": 20,"blockedTime": -1,"blockedCount": 8,"waitedTime": -1,"waitedCount": 0,"lockName": null,"lockOwnerId": -1,"lockOwnerName": null,"inNative": true,"suspended": false,"threadState": "RUNNABLE","stackTrace": [
    {
      "methodName": "epollWait","fileName": "Native.java","lineNumber": -2,"className": "io.netty.channel.epoll.Native","nativeMethod": true
    },{
      "methodName": "epollWait","lineNumber": 148,"nativeMethod": false
    },"lineNumber": 141,{
      "methodName": "epollWaitNoTimerChange","fileName": "EpollEventLoop.java","lineNumber": 290,"className": "io.netty.channel.epoll.EpollEventLoop",{
      "methodName": "run","lineNumber": 347,{

======

我不知道,

netty epoll 没有遇到困难的情况?

docker net 机制不符合? (我也在没有 docker 的情况下进行了测试,结果相同)

Linux 内核不满足硬性要求?

AWS EC2 网络带宽性能低?

问题是,为什么它不再使用 cpu 来获得更多 TPS,即使它有更多空间来执行更多请求。

希望为此找到一些解决方案...

解决方法

这个问题在 Github 上交叉发布:

https://github.com/netty/netty/issues/11492

您似乎对那里的答案感到满意。

,

Nitesh 很好地说明了情况。

现在我将后端服务器从简单的 Node 应用程序更改为简单的 WebFlux 应用程序。 Noode的单核是瓶颈, 当我将后端服务器更改为 WebFlux 应用程序时,它显示了最大 tps,

现在我觉得这个示例项目没有什么奇怪的地方。

谢谢大家。

-- 顺便说一句,现在我需要回到我公司项目的原始问题。 ,它的低性能。 现在它调整了 WebClient 不是问题。

谢谢大家