【问题标题】:WebFlux WebClient performance doesn't touch maximum of CPUWebFlux WebClient 性能不会触及 CPU 的最大值
【发布时间】:2021-09-26 08:11:12
【问题描述】:

我正在编写一个网络密集型 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 作业的工作负载(但有 1ms 延迟)

外部调用是用内部的简单节点服务器实现的 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",
      "fileName": "Native.java",
      "lineNumber": 148,
      "className": "io.netty.channel.epoll.Native",
      "nativeMethod": false
    },
    {
      "methodName": "epollWait",
      "fileName": "Native.java",
      "lineNumber": 141,
      "className": "io.netty.channel.epoll.Native",
      "nativeMethod": false
    },
    {
      "methodName": "epollWaitNoTimerChange",
      "fileName": "EpollEventLoop.java",
      "lineNumber": 290,
      "className": "io.netty.channel.epoll.EpollEventLoop",
      "nativeMethod": false
    },
    {
      "methodName": "run",
      "fileName": "EpollEventLoop.java",
      "lineNumber": 347,
      "className": "io.netty.channel.epoll.EpollEventLoop",
      "nativeMethod": false
    },
    {

======

我不知道,

netty epoll 遇到困难的情况?

docker net 机制不满足? (我也在没有docker的情况下测试过,结果一样)

Linux 内核不适应?

AWS EC2 网络带宽性能低?

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

希望能找到解决办法...

【问题讨论】:

标签: performance netty webclient cpu-usage webflux


【解决方案1】:

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

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

看来你对那里的答案很满意。

【讨论】:

    【解决方案2】:

    Nitesh 提供了一个很好的线索。

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

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

    谢谢大家。

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

    谢谢大家

    【讨论】:

      猜你喜欢
      • 2017-08-25
      • 2012-10-09
      • 2020-05-18
      • 2018-05-09
      • 2019-08-28
      • 2020-10-01
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      相关资源
      最近更新 更多