2013-12-20 4 views
2

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

Наблюдение: простые запросы API JSON берут порядка 100 миллисекунд на промежуточном сервере без нагрузки и < 10 пользователей в базе данных. В частности, вызов/API/get_user принимает ~ 300мс

выполнить этот код:

exports.get_user = function(req, res) { 
    return res.json(req.user) 
} 

(Примечание: мы храним наши сессии в Redis)

Стек:

  • Nodejs
  • Экспресс
  • Redis
  • Монго

С чего начать?

+0

Как вы инициализируете 'req.user'? – srquinn

+1

Здесь действительно недостаточно информации, чтобы угадать, в какую проблему вы попадаете. – loganfsmyth

+0

Укажите, где физически отображаются ваши услуги (узел, redis, mongo). Предоставьте большую часть кода, который фактически выполняется. Также, как правило, легко определить время выполнения операции, добавив console.log (new Date()) в скрипт, который выполняется. – igorpavlov

ответ

1

Хотя это может быть излишним для этого небольшого сценария, вы можете рассмотреть возможность профилирования. Я нашел службу nodetime.com весьма полезной.

+0

Я запустил профиль транзакции в/api/get_user на nodetime и получил 12.9мс: [nodetime screenshot] (https: //dl.dropboxusercontent. ком/и/3826044/nodeprofile/nodetime_transaction.png). Но тот же запрос на инструментах chrome dev показывает 607ms: [dev tools screenshot] (https://dl.dropboxusercontent.com/u/3826044/nodeprofile/devtools_roundtrip.png). Так как nodetime просто измеряет, сколько времени требуется для того, чтобы узел мог генерировать запрос, должен ли я предположить, что разница заключается в времени, которое требуется для запроса на поездку через открытый интернет? – max

+0

Да, это разумное предположение. Я не знаю подробностей о вашей топологии развертывания. На вашей линии может быть латентность, или просто вы можете проводить время в режиме dns. Кроме того, вы можете захотеть измерить поток непрерывных запросов, отбрасывающих первые несколько, которые, как правило, занимают больше времени из-за времени загрузки. –

+0

Я обнаружил, что директива limit_req nginx была слишком ограничительной и отвечала за большую часть задержки. Благодарю. – max

0

Передача флага –-nouse_idle_notification будет означать, что V8 игнорирует запросы на незанятые уведомления от узла, которые обращаются к V8 с просьбой немедленно запустить GC, поскольку процесс узла в настоящее время не работает. Поскольку Узел агрессивен с этими вызовами (эффективность порождает чистые сланцы), избыток GC может замедлить ваше приложение. Обратите внимание, что использование этого флага не отключает GC; GC просто работает реже. При правильных обстоятельствах этот метод может повысить производительность.

Смежные вопросы