Сервер Node js и инструмент Apache ab: неожиданное поведение - PullRequest
0 голосов
/ 19 января 2019

При тестировании сервера простого узла (написанного с помощью 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 голосов
/ 23 января 2019

Используя прокси-сервер Fiddler, я обнаружил, что инструмент AB запускается больше раз, чем количество запросов, которые должны быть выполнены (пример: -n 200 ).

При выполнении серии последовательных тестов:

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

Прокси-сервер и сервер узлов сообщают о 2209 запросах.Похоже, что AB менее неточен с прокси в середине, но все еще неточен.

В целом, и что более важно, я никогда не обнаруживал несоответствия между запросами, проходящими через прокси, и запросами, полученными узломсервер.

Спасибо!

0 голосов
/ 22 января 2019

Это очень странно, и я не получаю такие же результаты, как вы на моей машине. Я был бы очень удивлен, если бы ab выдавал разное количество фактических запросов.

Вещи, которые я бы попробовал:

  • Напишите простой сервер, используя экспресс, а не хапи. Если проблема все еще возникает, вы, по крайней мере, знаете, что это не проблема хапи.
  • Перехват сетевых вызовов с помощью fiddler
    • ab -X localhost:8888 -n 100 -c 30 http://127.0.0.1:3000/test будет использовать прокси-сервер fiddler, который позволит вам видеть фактические вызовы через сетевой интерфейс. подробнее
  • wireshark , если вам нужно больше энергии и ваше чувство храбрости (я бы использовал это, только если скрипач вас подвел)

Если после всего этого вы все еще находите проблему, то она сузилась до проблемы с узлом, я не уверен, что еще это может быть. Попробуйте использовать узел 8, а не 10.

...