节点 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 中间的代理不那么不精确,但仍然不精确。

总的来说,更重要的是,我从未发现通过代理传递的请求与节点服务器接收到的请求不匹配。

谢谢!