Rails Unicorn - Задержка между запросом на запуск и достижением контроллера
Я использую Unicorn в качестве моего сервера приложений для своего приложения Rails, и пытаюсь понять, почему иногда бывает нетривиальная ( > 5 секунд) задержка между началом запроса и достижением моего контроллера.
Это то, что выводит мой production.log:
Started GET "/search/articles.json?q=mashable.com" for 138.7.7.33 at 2015-07-23 14:59:19 -0400**
Parameters: {"q"=>"mashable.com"}
Searching articles for keyword: mashable.com, format: json, Time: 2015-07-23 14:59:26 -0400
Обратите внимание, что существует 7-секундная задержка между STARTED GET: и "Поиск статей для ключевого слова", что является первым, что делает метод контроллера.
articles.json перенаправляется на мой метод "статей" моего контроллера, который просто делает это сейчас:
def articles
format = params[:format]
keyword = params["q"]
Rails.logger.info "Searching articles for keyword: #{keyword}, format: #{format}, Time: #{Time.now.to_s}"
end
Это мои маршруты .rb
MyApp::Application.routes.draw do
match '/search/articles' => 'search#articles'
#more routes here, but articles is the first route
end
Что может вызвать эту задержку? Это потому, что рабочий из Единорога занят? Это потому, что работник Единорога занимает слишком много памяти, что приводит к замедлению работы системы?
Примечание. Я не считаю, что задержка заключается в создании каких-либо подключений к базе данных, но я могу ошибаться. Коду не нужно делать вызов базы данных, а максимальные соединения для моей базы данных - 1000, и обычно не более 1-2 соединений.
Ответы
Ответ 1
Три мысли:
-
Вероятно, вам лучше будет использовать Puma вместо Unicorn
-
Возможно, в вашей системе не хватает памяти или у нее может быть достаточно памяти: установите новую Relic для устранения неполадок, где узкое место
-
Также может быть, что у вас больше экземпляров Unicorn, чем количество подключений, которые позволяет ваша БД, и в этом случае экземпляру приходится ждать, пока другие будут отключены, прежде чем он сможет подключиться. Вероятно, это проявляется с нерегулярными 5-секундными задержками, а не с каждым разом.
Ответ 2
На самом деле это может быть вызвано обратным вызовом before_filter, вы должны проверить его
Ответ 3
Я думаю, что это может быть из-за нехватки памяти и, следовательно, частых сборок мусора, которые замораживают всю систему.
Ответ 4
Если это проблема с производством, это может быть вызвано медленными клиентами, отправляющими запросы. Новые Relic и Monit - хорошие варианты. Вы можете подумать о отправке сигналов работникам Unicorn, чтобы перезапустить их, чтобы лучше понять проблему.
Вы также можете попробовать добавить preload_app true
в конфигурацию Unicorn, чтобы ускорить время запуска рабочих процессов.