0

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

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

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

====

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

用于 WebClient 性能的 perfwebf 示例项目

/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 Mem)上进行了测试,

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

当测试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,即使它有更多的空间来执行更多的请求。

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

4

2 回答 2

0

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

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

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

于 2021-07-20T19:54:58.080 回答
0

Nitesh 很好地说明了情况。

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

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

感谢你所做的一切。

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

感谢你所做的一切

于 2021-07-21T12:41:14.463 回答