Артиллерийская NodeJS Проблема производительности кластера - PullRequest
0 голосов
/ 28 мая 2018

Я использую Artillery.IO с NodeJS для измерения производительности.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: 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 ]

0 голосов
/ 31 мая 2018

У вас есть опечатка в вашем файле 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и артиллерия работает по той же системе?

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

Single Cluster

Single Cluster - Top

4 Кластер

#4 Cluster - Top

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

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

С уважением

0 голосов
/ 05 июня 2018

Я получаю другое время ответа.Ниже приведен мой 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

CASE 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
0 голосов
/ 31 мая 2018

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

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

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

...