Node JS服务器和Apache AB工具:意外行为

时间:2019-01-18 21:26:36

标签: node.js apache http concurrency hapijs

在测试简单的节点服务器(用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

Env详细信息:

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请求,或者节点服务器响应的次数是否超过了必要。

能请你帮忙吗?

2 个答案:

答案 0 :(得分:1)

这很奇怪,我在计算机上得到的结果与您不同。如果是Ab发出不同数量的实际请求,我会感到非常惊讶。

我会尝试的事情:

  • 使用express而不是hapi编写一个简单的服务器。如果问题仍然存在,那么您至少知道它不是hapi问题。
  • 使用fiddler拦截网络通话
    • ab -X localhost:8888 -n 100 -c 30 http://127.0.0.1:3000/test将使用fiddler代理,然后该代理将使您看到整个网络接口上的实际呼叫。 more details
  • wireshark,如果您需要更多的力量和勇敢的感觉(我只会在提琴手让您失望的情况下使用它)

如果毕竟您仍然找到问题,那么它已经缩小为节点问题,我不确定还有什么问题。尝试使用节点8而不是10。

答案 1 :(得分:1)

使用Fiddler代理,我发现AB工具运行的次数超过了要执行的请求的次数(例如: -n 200 )。

通过运行一系列连续的测试:

# 11 consecutive times
/usr/bin/ab -n 200 -c 30 -X localhost:8888 http://localhost:3000/test

代理和节点服务器均报告总共 2209 个请求。看起来AB对中间的代理服务器不太准确,但仍然不准确。

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

谢谢!