NodeJS socket.io无法在性能测试中处理到达率

时间:2018-07-30 15:29:27

标签: node.js docker socket.io artillery

在对我的node.js socket.io应用程序进行性能测试时,似乎无法处理所需数量的并发Websocket请求。

我正在使用以下规范在Docker环境中测试应用程序:

CPU: 2 Ram: 4 GB

该应用程序被精简到最低限度,仅接受使用socket.io + express.js的websocket连接。

我在artillery.io的帮助下进行了测试,测试场景为:

config:
  target: "http://127.0.0.1:5000"
  phases:
    - duration: 100
      arrivalRate: 20
scenarios:
    - engine: "socketio"
      flow:
      - emit:
          channel: "echo"
          data: "hello"        
      - think: 50

报告:

Summary report @ 16:54:31(+0200) 2018-07-30
  Scenarios launched:  2000
  Scenarios completed: 101
  Requests completed:  560
  RPS sent: 6.4
  Request latency:
    min: 0.1
    max: 3
    median: 0.2
    p95: 0.5
    p99: 1.4
    Scenario counts:
    0: 2000 (100%)
  Codes:
    0: 560
  Errors:
    Error: xhr poll error: 1070
    timeout: 829

所以我收到很多xhr民意调查错误。 当我监视CPU +内存状态时,CPU的最大值仅为 43.25%。内存只会达到 4%

即使我在 100 秒的时间内将测试的到达率更改为 20 ,我仍然会收到XHR轮询错误。

那么,这些测试编号是否超出了符合此规范的nodejs + socket.io的能力,还是其他功能正常工作?也许是docker环境还是Artillery软件?

任何帮助或建议将不胜感激!

旁注:已经研究过nodejs集群以进行扩展,但希望首先从一个进程中获得最大收益。

更新1

在使用Websocket Stresstest脚本进行了更多测试之后,发现以下网址:https://gist.github.com/redism/11283852 当我使用高于50的到达率或想要建立更多的连接(+/- 1900)时,似乎达到了某种限制。

直到1900个连接,几乎每个连接都被建立,但是在此数目之后,XHR轮询错误将呈指数增长。

对于Docker容器,仍然没有较高的CPU或内存值。

XHR轮询错误的详细信息:

Error: xhr poll error
at XHR.Transport.onError (D:\xxx\xxx\api\node_modules\engine.io-client\lib\transport.js:64:13)
at Request.<anonymous> (D:\xxx\xxx\api\node_modules\engine.io-client\lib\transports\polling-xhr.js:128:10)
at Request.Emitter.emit (D:\xxx\xxx\api\node_modules\component-emitter\index.js:133:20)
at Request.onError (D:\xxx\xxx\api\node_modules\engine.io-client\lib\transports\polling-xhr.js:309:8)
at Timeout._onTimeout (D:\xxx\xxx\api\node_modules\engine.io-client\lib\transports\polling-xhr.js:256:18)
at ontimeout (timers.js:475:11)
at tryOnTimeout (timers.js:310:5)
at Timer.listOnTimeout (timers.js:270:5) type: 'TransportError', description: 503 

更新2

在炮兵测试中将运输方式更改为“ websocket”会带来更好的性能。

测试用例:

config:
  target: "http://127.0.0.1:5000"
  socketio:
    transports: ["websocket"]
  phases:
    - duration: 20
      arrivalRate: 200
scenarios:
    - engine: "socketio"
      flow:
      - emit:
          channel: "echo"
          data: "hello"        
      - think: 50

结果:到达率不再是问题,但我在2020年连接时达到了某种限制。之后,它会显示“ Websocket错误”。

这是Windows 10的限制,您可以更改吗?这是限制使用长轮询进行测试的结果如此糟糕

的原因吗?

0 个答案:

没有答案