Подтвердить что ты не робот

Node.JS Время отклика

Забросил Node.JS на экземпляр AWS и тестировал время запроса, получил интересные результаты.

Я использовал для сервера следующее:

var http = require('http');

http.createServer(function(req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.write('Hello World');
  res.end();
}).listen(8080);

У меня есть средняя задержка 90 мс на этом сервере, но общий запрос занимает ~ 350 + мс. Очевидно, много времени тратится на коробку. Я убедился, что DNS был кэширован до теста.

Я сделал сканер Apache на сервере с коллавтомом 1000 - он завершил 10 000 запросов за 4,3 секунды... что означает среднее значение в 4,3 миллисекунды.

ОБНОВЛЕНИЕ: только для усмешек я установил Apache + PHP на один и тот же компьютер и сделал простое эхо "Hello World" и получил среднее время отклика 92 мс (два пинга).

Есть ли какая-то настройка где-то, что мне не хватает?

4b9b3361

Ответ 1

Я абсолютно ненавижу отвечать на мои собственные вопросы, но я хочу передать то, что я открыл с будущими читателями.

tl; dr: Что-то не так с res.write(). Используйте express.js или res.end()

Я только что провела кучу тестов. Я настраиваю несколько типов сервера Node и смешиваюсь с такими вещами, как PHP и Nginx. Вот мои выводы.

Как уже говорилось выше, с приведенным выше фрагментом я потерял около 250 мс/запрос, но тесты Apache не реплицировали эти проблемы. Затем я приступил к выполнению теста PHP и получил результаты от 2 мс до 20 мс за пинг... большая разница.

Это вызвало еще несколько исследований, я запустил сервер Nginx и проксировал через него Node, и каким-то образом, это волшебным образом изменило ответ от 250 мс до 15 мс за пинг. Я был на одном уровне с PHP скрипт, но это действительно запутанный результат. Обычно дополнительные прыжки замедлят работу.

Заинтригованный, я также сделал сервер express.js - и что-то еще более интересное произошло, пинг был 2 мс сам по себе. Я долгое время копался в источнике и замечал, что ему не хватает команды res.write(), скорее, он перешел прямо к res.end(). Я запустил еще один сервер, удалив "Hello World" из res.write и добавив его в res.end, и удивительно, что ping был 0 мс за пинг.

Я немного поработал над этим, хотел посмотреть, была ли это известная проблема, и наткнулся на этот вопрос SO, у которого была такая же проблема. скорость ответа узла и nginx

В целом, интересный материал. Убедитесь, что вы оптимизировали свои ответы и сразу же отправили их.

Удачи всем!

Ответ 2

В то время как Chrome Developer Tools - хороший способ исследовать производительность переднего конца, он дает очень приблизительную оценку фактических нагрузок сервера/загрузки процессора. Если у вас есть общее время запроса ~ 350 мс в инструментах dev, вычитайте из этого числа DNS-поиск + Подключение + Отправка + Получение, а затем вычитайте время округления (90 мс?), После чего вы получите первую оценку. В вашем случае я ожидаю, что фактическое время запроса будет субмиллисекундным. Попробуйте запустить этот код на сервере:

var http = require('http');
function hrdiff(t1, t2) {
    var s = t2[0] - t1[0];
    var mms = t2[1] - t1[1];
    return s*1e9 + mms;
}
http.createServer(function(req, res) {
  var t1 = process.hrtime();
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.write('Hello World');
  res.end();
  var t2 = process.hrtime();
  console.log(hrdiff(t1, t2));
}).listen(8080);

На основе результата ab вы должны оценить среднее время отправки + запроса + время приема не более 4,2 мс (4200 мс /10000 реак) (вы запустили его на сервере? что concurrency?)