Чрезвычайно низкая производительность для базовой службы Node.js в OSX

Я относительно новичок в Node.js (играю с ним некоторое время, но только начинаю использовать его для серьезных вещей). Я испытывал очень странное поведение при тестировании локально, и решил создать самый простой из возможных HTTP-серверов и сравнить его с Apache Benchmark (ab).

Вот мой код:

var http = require('http');

http.createServer(function(req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.write('Hello, world!');
  res.end();
}).listen(8888);

Когда я бегу ab так:

ab -n 1000000 -c 100 'http://127.0.0.1:8888/'

Я получаю следующие результаты:

This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
apr_socket_recv: Operation timed out (60)
Total of 16413 requests completed

Я использую nodejs версии 0.10.25. Я также установил свой ulimit равным 8192 (максимум) перед запуском моего сервера и ab - так что ограничения файловых дескрипторов не могут быть достигнуты.

Вот что я не понимаю:

  • Почему AB не может сделать все 1 миллион запросов? Почему он терпит неудачу только после ~16000?
  • Это нормальное поведение? Я ожидал увидеть большую пропускную способность и быстро закончить тесты.

Спасибо!

Бонус: я записал небольшую заставку, которую вы можете посмотреть здесь: http://recordit.co/9i0ja6GZqR Это показывает, о чем я говорю.

ОБНОВИТЬ:

После просмотра этого поста: почему простой Thin-сервер перестает отвечать на 16500 запросов при тестировании? и работает:

sudo sysctl -w net.inet.tcp.msl=1000

Я смог успешно выполнить команду ab со следующими результатами:

This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 100000 requests
Completed 200000 requests
Completed 300000 requests
Completed 400000 requests
Completed 500000 requests
Completed 600000 requests
Completed 700000 requests
Completed 800000 requests
Completed 900000 requests
Completed 1000000 requests
Finished 1000000 requests


Server Software:
Server Hostname:        127.0.0.1
Server Port:            8888

Document Path:          /
Document Length:        13 bytes

Concurrency Level:      100
Time taken for tests:   338.545 seconds
Complete requests:      1000000
Failed requests:        0
Write errors:           0
Total transferred:      114000000 bytes
HTML transferred:       13000000 bytes
Requests per second:    2953.82 [#/sec] (mean)
Time per request:       33.854 [ms] (mean)
Time per request:       0.339 [ms] (mean, across all concurrent requests)
Transfer rate:          328.84 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0   14 212.3      0    8363
Processing:     0   20 114.8     11    4205
Waiting:        0   20 114.2     11    4205
Total:          0   34 240.8     11    8368

Percentage of the requests served within a certain time (ms)
  50%     11
  66%     13
  75%     14
  80%     14
  90%     17
  95%     21
  98%     32
  99%    605
 100%   8368 (longest request)

К сожалению, я не могу выйти за пределы 100 одновременных запросов - например, если я увеличу до 200, я получу следующее:

rdegges at Randalls-MacBook-Pro in ~
○ ab -n 1000000 -c 200 'http://127.0.0.1:8888/'
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
apr_socket_recv: Connection reset by peer (54)

Похоже, я по сути ограничен 100 одновременными запросами.

Другая вещь, которая меня беспокоит, это время ответа первой команды ab. Похоже, что среднее время отклика составляло около 33,854 мс, что кажется ужасно высоким, учитывая то, что делает сервер.

Поэтому я предполагаю, что мой вопрос: что я могу сделать, чтобы улучшить одновременные запросы и сократить время обработки каждого запроса? Я уверен, что я делаю что-то не так здесь.

Спасибо!

1 ответ

Сделайте так, чтобы целевой компьютер ничего не делал, кроме запуска кластера или другого многоядерного узла (это бесполезно или не актуально для теста одного узла процесса).

Имейте несколько компьютеров, бомбардирующих целевой компьютер через локальную сеть, не запускайте ab или подобное от самого сервера.

Другие вопросы по тегам