Сервер Node js и инструмент Apache 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

Детали 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-запросов или сервер узлов отвечает больше раз, чем необходимо.

Не могли бы вы помочь?


person zsimo    schedule 18.01.2019    source источник
comment
Не могли бы вы обновить вопрос, включив также вывод, который вы видите. сколько строк журнала было напечатано? каков был вывод процесса узла, а также вывод команды ab? благодаря.   -  person Damo    schedule 21.01.2019
comment
Также какую версию node и hapi вы используете? в какой вы ОС и как вы запускаете тестовое приложение? Я предполагаю с node server.js или тому подобное.   -  person Damo    schedule 21.01.2019
comment
вопрос обновлен!   -  person zsimo    schedule 21.01.2019
comment
Я использую ubuntu, node 8.14.0 и пробовал последнюю версию hapi и версию, которую вы процитировали. у меня не было никаких проблем. количество полных запросов совпадает с числом в консоли. то же самое для -n 1000 -c 1000 или -n 1000 -c 1 влияет ли уровень параллелизма на результаты, которые вы видите? что делать, если параллелизма нет или только 2 или 10?   -  person Damo    schedule 22.01.2019
comment
вопрос обновлен с примерами вывода   -  person zsimo    schedule 22.01.2019


Ответы (2)


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

Что бы я попробовал:

  • Напишите простой сервер, используя экспресс, а не hapi. Если проблема все еще возникает, вы, по крайней мере, знаете, что это не проблема с hapi.
  • Intercept the network calls using fiddler
    • ab -X localhost:8888 -n 100 -c 30 http://127.0.0.1:3000/test will use the fiddler proxy which will then let you see the actual calls across the network interface. more details
  • wirehark, если вам нужно больше мощности и вы чувствуете себя храбрым (я бы использовал его только в том случае, если скрипач подвел вас )

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

person Damo    schedule 22.01.2019

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

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

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

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

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

Спасибо!

person zsimo    schedule 23.01.2019
comment
Это действительно странно, мне было бы действительно интересно посмотреть, сможете ли вы воспроизвести то же поведение в другой системе. Я использовал ab много раз в прошлом и никогда не видел этой проблемы. Спасибо, что сообщили мне, в чем заключалась ваша проблема. - person Damo; 23.01.2019