节点 js 服务器和 Apache ab 工具:意外行为
Node js server and Apache ab tool: unexpected behavior
在测试一个简单的节点服务器时(用Hapi.js编写):
'use strict';
var Hapi = require("hapi");
var count = 0;
const server = Hapi.server({
port: 3000,
host: 'localhost'
});
server.route({
method: 'GET',
path: '/test',
handler: (request, h) => {
count ++;
console.log(count);
return count;
}
});
const init = async () => {
await server.start();
};
process.on('unhandledRejection', (err) => {
process.exit(1);
});
init();
启动服务器:
node ./server.js
运行 Apache ab 工具:
/usr/bin/ab -n 200 -c 30 localhost:3000/test
环境详情:
OS: CentOS release 6.9
Node: v10.14.1
Hapi.js: 17.8.1
我在多个并发请求(-c 30)的情况下发现意外结果:请求处理函数被调用的次数超过要执行的请求数(-n 200)。
Ab输出示例:
Benchmarking localhost (be patient)
Server Software:
Server Hostname: localhost
Server Port: 3000
Document Path: /test
Document Length: 29 bytes
Concurrency Level: 30
Time taken for tests: 0.137 seconds
Complete requests: 200
Failed requests: 0
Write errors: 0
Total transferred: 36081 bytes
HTML transferred: 6119 bytes
Requests per second: 1459.44 [#/sec] (mean)
Time per request: 20.556 [ms] (mean)
Time per request: 0.685 [ms] (mean, across all concurrent requests)
Transfer rate: 257.12 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 0
Processing: 15 17 1.5 16 20
Waiting: 2 9 3.9 9 18
Total: 15 17 1.5 16 21
Percentage of the requests served within a certain time (ms)
50% 16
66% 16
75% 17
80% 18
90% 20
95% 20
98% 21
99% 21
100% 21 (longest request)
节点服务器打印出211行日志。在各种测试中,不匹配是可变的,但始终存在:
-n 1000 -c 1 -> 1000 log
-n 1000 -c 2 -> ~1000 logs
-n 1000 -c 10 -> ~1001 logs
-n 1000 -c 70 -> ~1008 logs
-n 1000 -c 1000 -> ~1020 logs
似乎随着并发的增加,不匹配也会增加。
我无法弄清楚是 ab 工具执行了更多的 http 请求还是节点服务器响应了不必要的次数。
你能帮忙吗?
这很奇怪,我在我的机器上没有得到与您相同的结果。如果是 ab 发出了不同数量的实际请求,我会感到非常惊讶。
我会尝试的事情:
- 使用 express 而不是 hapi 编写一个简单的服务器。如果问题仍然存在,你至少知道它不是 hapi 的问题。
- 使用fiddler拦截网络调用
ab -X localhost:8888 -n 100 -c 30 http://127.0.0.1:3000/test
将使用 fiddler 代理,然后让您看到网络接口上的实际调用。 more details
- wireshark 如果你需要更多的力量和你的勇气(我只会在 fiddler 让你失望的时候使用它)
如果在所有这些之后您仍然发现问题,那么它已缩小为节点问题,我不确定它可能是什么。尝试使用节点 8 而不是 10。
使用Fiddler代理我发现AB工具运行的次数超过了要执行的请求数(例如:-n 200)。
通过运行一系列连续的测试:
# 11 consecutive times
/usr/bin/ab -n 200 -c 30 -X localhost:8888 http://localhost:3000/test
代理和节点服务器都报告了总共 2209 个请求。看起来 AB 中间的代理不那么不精确,但仍然不精确。
总的来说,更重要的是,我从未发现通过代理传递的请求与节点服务器接收到的请求不匹配。
谢谢!
在测试一个简单的节点服务器时(用Hapi.js编写):
'use strict';
var Hapi = require("hapi");
var count = 0;
const server = Hapi.server({
port: 3000,
host: 'localhost'
});
server.route({
method: 'GET',
path: '/test',
handler: (request, h) => {
count ++;
console.log(count);
return count;
}
});
const init = async () => {
await server.start();
};
process.on('unhandledRejection', (err) => {
process.exit(1);
});
init();
启动服务器:
node ./server.js
运行 Apache ab 工具:
/usr/bin/ab -n 200 -c 30 localhost:3000/test
环境详情:
OS: CentOS release 6.9
Node: v10.14.1
Hapi.js: 17.8.1
我在多个并发请求(-c 30)的情况下发现意外结果:请求处理函数被调用的次数超过要执行的请求数(-n 200)。
Ab输出示例:
Benchmarking localhost (be patient)
Server Software:
Server Hostname: localhost
Server Port: 3000
Document Path: /test
Document Length: 29 bytes
Concurrency Level: 30
Time taken for tests: 0.137 seconds
Complete requests: 200
Failed requests: 0
Write errors: 0
Total transferred: 36081 bytes
HTML transferred: 6119 bytes
Requests per second: 1459.44 [#/sec] (mean)
Time per request: 20.556 [ms] (mean)
Time per request: 0.685 [ms] (mean, across all concurrent requests)
Transfer rate: 257.12 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 0
Processing: 15 17 1.5 16 20
Waiting: 2 9 3.9 9 18
Total: 15 17 1.5 16 21
Percentage of the requests served within a certain time (ms)
50% 16
66% 16
75% 17
80% 18
90% 20
95% 20
98% 21
99% 21
100% 21 (longest request)
节点服务器打印出211行日志。在各种测试中,不匹配是可变的,但始终存在:
-n 1000 -c 1 -> 1000 log
-n 1000 -c 2 -> ~1000 logs
-n 1000 -c 10 -> ~1001 logs
-n 1000 -c 70 -> ~1008 logs
-n 1000 -c 1000 -> ~1020 logs
似乎随着并发的增加,不匹配也会增加。
我无法弄清楚是 ab 工具执行了更多的 http 请求还是节点服务器响应了不必要的次数。
你能帮忙吗?
这很奇怪,我在我的机器上没有得到与您相同的结果。如果是 ab 发出了不同数量的实际请求,我会感到非常惊讶。
我会尝试的事情:
- 使用 express 而不是 hapi 编写一个简单的服务器。如果问题仍然存在,你至少知道它不是 hapi 的问题。
- 使用fiddler拦截网络调用
ab -X localhost:8888 -n 100 -c 30 http://127.0.0.1:3000/test
将使用 fiddler 代理,然后让您看到网络接口上的实际调用。 more details
- wireshark 如果你需要更多的力量和你的勇气(我只会在 fiddler 让你失望的时候使用它)
如果在所有这些之后您仍然发现问题,那么它已缩小为节点问题,我不确定它可能是什么。尝试使用节点 8 而不是 10。
使用Fiddler代理我发现AB工具运行的次数超过了要执行的请求数(例如:-n 200)。
通过运行一系列连续的测试:
# 11 consecutive times
/usr/bin/ab -n 200 -c 30 -X localhost:8888 http://localhost:3000/test
代理和节点服务器都报告了总共 2209 个请求。看起来 AB 中间的代理不那么不精确,但仍然不精确。
总的来说,更重要的是,我从未发现通过代理传递的请求与节点服务器接收到的请求不匹配。
谢谢!