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 мс (два пинга).
Есть ли какая-то настройка где-то, что мне не хватает?
Ответы
Ответ 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?)