Артиллерийская NodeJS Проблема производительности кластера

Я использую Artillery.IO с NodeJS для измерения производительности. NodeJS работает на моем локальном хосте, и я также использую 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: NodeJS работает с 4 кластерами.

РЕЗУЛЬТАТ: =============================

Сценариев запущено: 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

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

Мой код Node 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, который написан неправильно для измерения производительности.

Пожалуйста помоги.

3 ответа

У вас есть опечатка в вашем YML-файле, "target" должен быть " http://localhost:3000/" (без завершающего символа "/").

Вот почему вы получаете HTTP 404 (НЕ НАЙДЕНО) вместо HTTP 200 (ОК)

Пожалуйста, обновите 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 (ОК)

О ваших вопросах:

Мой вопрос: почему нет улучшения, когда я запускаю NodeJS в режиме кластера?

Не является обязательным, если ваш код не разбивает рабочую нагрузку на несколько частей, которые могут выполняться все вместе одновременно, а затем составлять результат в конце, вы не получите более быстрый результат. Производительность связана со скоростью процессора, а пропускная способность - с числом процессоров + скорость процессора. (Это две разные темы).

Связано ли это с тем, что и NodeJS, и Artillery работают в одной системе?

Нет, артиллерия не оказывает влияния. Посмотрите на следующие рисунки, единственный процесс, который связан с процессором, это код вашего узла (arti.js).

Один кластер

Один кластер - топ

4 кластера

4 Кластер - Верх

или это код server.js, который неправильно написан для измерения производительности?

Точно, частично ответил раньше. Ваш код будет работать с ухудшением, если число серверов узлов больше, чем доступные процессоры или виртуальные ЦП. И это потому, что ваш код в основном однопоточный код.

С уважением

Я получаю другое время ответа. Ниже мой код yml.

config:
  target: "http://localhost:3000"
  phases:
    - duration: 10
      arrivalRate: 10
scenarios:
  - flow:
    - get:
        url: "/" 

Время отклика

СЛУЧАЙ 1

Отчет @ 12:29:38(+0530) 2018-06-05

Scenarios launched:  0
  Scenarios completed: 1
  Requests completed:  1
  RPS sent: NaN
  Request latency:
    min: 110658.5
    max: 110658.5
    median: 110658.5
    p95: 110658.5
    p99: 110658.5
  Codes:
    200: 1

ДЕЛО 2

Все виртуальные пользователи закончили Сводный отчет @ 12:29:48(+0530) 2018-06-05

Scenarios launched:  100
  Scenarios completed: 10
  Requests completed:  10
  RPS sent: 0.77
  Request latency:
    min: 11300.8
    max: 110658.5
    median: 60775.7
    p95: 110658.5
    p99: 110658.5
  Scenario counts:
    0: 100 (100%)
  Codes:
    200: 10
  Errors:
    ESOCKETTIMEDOUT: 90

Это потому, что ваш артиллерийский конфиг настроен на работу в течение 10 секунд. По прошествии 10 секунд артиллерийский сценарий закроется, хотя он еще не получил отклика на запросы на полет.

Ваши результаты показывают, что на все запросы ответили 404, и это артиллерия будет использовать по умолчанию при выходе из нее до получения ответов на запросы на полет.

Код вашего сервера в порядке и требует много времени для ответа, как и следовало ожидать. На моем ноутбуке это около 10 секунд.

Другие вопросы по тегам