Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Сервер Node js и инструмент Apache ab: неожиданное поведение

Автор вопроса: zsimoОтветов: 2

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

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

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

httpapacheconcurrencyhapijs

Ответы

Ответ 1 · рейтинг 1 · Damo

Это очень странно, и я не получаю таких же результатов, как вы, на своей машине. Я был бы очень удивлен, если бы именно 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.

Ответ 2 · рейтинг 1 · zsimo

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

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

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

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

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

Спасибо!

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы