簡體   English   中英

WebFlux WebClient 性能不會觸及 CPU 的最大值

[英]WebFlux WebClient performance doesn't touch maximum of CPU

我正在編寫一個網絡密集型 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 作業的工作負載(但延遲 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 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,即使它有更多的空間來執行更多的請求。

希望為此找到一些解決方案......

這個問題在 Github 上交叉發布:

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

看來你對那里的答案很滿意。

Nitesh 很好地說明了情況。

現在我將后端服務器從簡單的 Node 應用程序更改為簡單的 WebFlux 應用程序。 Noode 的單核是瓶頸,當我將后端服務器更改為 WebFlux 應用程序時,它顯示了最大 tps,

現在我認為這個示例項目沒有什么奇怪的地方。

感謝你所做的一切。

-- 順便說一句,現在我需要回到我公司項目的原始問題。 ,它的低性能。 現在它調整了 WebClient 不是問題。

感謝你所做的一切

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM