首页 > 解决方案 > Artillery NodeJS 集群性能基准测试问题

问题描述

我正在使用带有 NodeJS 的 Artillery.IO 来衡量性能。NodeJS 在我的本地主机上运行,​​我也在同一台机器上运行 Artillery。

当我用这个脚本运行 Artillery 时。

{
  "config": {
      "target": "http://localhost:3000/",
      "phases": [
          {
             "duration": 10,
             "arrivalRate": 2
          }
      ]
  },
  "scenarios": [
    {
       "flow": [
           {"get": {"url": "/"}}
       ]
    }
  ]
} 

案例 1:NodeJS 在单个集群中运行。

结果:===============================

推出的场景:20

已完成的场景:20

完成的请求:20

发送的 RPS:2

请求延迟:

min: 1.1

max: 4.6

median: 1.2

p95: 3.3

p99: 4.6

场景计数:

0: 20 (100%)

代码:

404: 20

===============================

案例 2:运行 4 个集群的 NodeJS。

结果:==============================

推出的场景:20

已完成的场景:20

完成的请求:20

发送的 RPS:2

请求延迟:

min: 1.2

max: 4.7

median: 1.4

p95: 3.2

p99: 4.7

场景计数:

0: 20 (100%)

代码:

404: 20

===========================

我的节点 Server.js 代码是:

var http    = require('http');
var express = require('express');
var os = require('os');
var app     = express();
var server  = http.createServer(app);
var io = require('socket.io')(server);

app.get('/', function(req, res,next) {
    for(let i = 0; i < 10000000000; i++) {

    }
    console.log("Get Request received");
    res.send(new Date());
});

server.listen(3000, function() {
    console.log("Server is running in Port 3000");
});

我的问题是为什么我在集群模式下运行 NodeJS 时没有任何改进?

它是否与 NodeJS 和 Artillery 在同一系统上运行的事实有关,或者它是 server.js 代码没有正确编写来衡量性能。

请帮忙。

标签: node.jsartillery

解决方案


您的 YML 文件中有错字,“目标”必须是“ http://localhost:3000 ”(没有尾随的“/”)。

这就是为什么您收到 HTTP 404 (NOT FOUND) 而不是 HTTP 200 (OK)

请按如下方式更新您的 YML 并重新运行您的测试:

{
  "config": {
      "target": "http://localhost:3000",
      "phases": [
          {
             "duration": 10,
             "arrivalRate": 2
          }
      ]
  },
  "scenarios": [
    {
       "flow": [
           {"get": {"url": "/"}}
       ]
    }
  ]
}

这里有我的结果:

单集群

All virtual users finished
Summary report @ 20:26:36(+0000) 2018-05-31
  Scenarios launched:  20
  Scenarios completed: 6
  Requests completed:  6
  RPS sent: 0.15
  Request latency:
    min: 20756.8
    max: 115390.2
    median: 68364.2
    p95: 115390.2
    p99: 115390.2
  Scenario counts:
    0: 20 (100%)
  Codes:
    200: 6
  Errors:
    ESOCKETTIMEDOUT: 14

#4 集群

All virtual users finished
Summary report @ 20:22:09(+0000) 2018-05-31
  Scenarios launched:  20
  Scenarios completed: 4
  Requests completed:  4
  RPS sent: 0.15
  Request latency:
    min: 81288.9
    max: 83085.9
    median: 82870.6
    p95: 83085.9
    p99: 83085.9
  Scenario counts:
    0: 20 (100%)
  Codes:
    200: 4
  Errors:
    ESOCKETTIMEDOUT: 16

请注意,在这两种情况下,代码都是 200(OK)

关于您的问题:

我的问题是为什么我在集群模式下运行 NodeJS 时没有任何改进?

不是强制性的,除非您的代码将工作负载拆分为可以同时运行的多个部分,然后在最后组合可交付成果,否则您不会获得更快的结果。性能与 CPU 速度有关,吞吐量与 CPU 数量 + CPU 速度有关。(它们是两个不同的主题)。

它是否与 NodeJS 和 Artillery 在同一系统上运行的事实有关?

不,大炮没有影响。查看以下图片,唯一受 CPU 限制的进程是您的节点服务器代码 (arti.js)。

单集群

单集群 - 顶部

4 集群

#4 集群 - 顶部

或者是 server.js 代码没有正确编写来衡量性能?

没错,之前部分回答了。如果节点服务器的数量大于可用的 CPU 或 vCPU,您的代码将运行降级。这是因为您的代码基本上是单线程代码。

问候


推荐阅读