Артиллерийская 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 кластера
или это код 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 секунд.