node.js - 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 代码没有正确编写来衡量性能。
请帮忙。
解决方案
您的 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 集群
或者是 server.js 代码没有正确编写来衡量性能?
没错,之前部分回答了。如果节点服务器的数量大于可用的 CPU 或 vCPU,您的代码将运行降级。这是因为您的代码基本上是单线程代码。
问候
推荐阅读
- python - 如何键入用于 Python 中多个子类的方法的装饰器
- haskell - 在这种情况下真的需要 FlexibleContexts 吗?
- python - 如果满足条件,如何在 Python 中插入带有修改文本的换行符?
- unit-testing - Glimmer 中的组件单元测试
- monetdb - 使用文件中的描述创建表
- python - Twitter Account Activity API - 'code': 214, 'message': 'CRC GET 请求期间的非 200 响应代码(即 404、500 等)。
- javascript - JavaScript:脚本仅在 Safari 中看不到全局变量
- javascript - 使用 JS 从 URL 下载 PDF 结果为 0k 文件
- c# - 使用 Monitor.Exit 引发的异常
- python - 可以实现哪些方法来加速 python 获取请求?异步?