Мониторинг медленных запросов nginx/ единорога
В настоящее время я использую Nginx для прокси-запросов на сервер Unicorn, на котором запущено приложение Sinatra. В приложении определена только пара маршрутов, из которых довольно простые (не дорогостоящие) запросы к базе данных PostgreSQL и, наконец, возвращение данных в формате JSON, Бог контролирует эти сервисы.
В настоящее время я испытываю крайне медленное время отклика с этого сервера приложений. У меня есть еще два сервера Unicorn, которые проксируются через Nginx, и они прекрасно реагируют, поэтому я думаю, что могу исключить любые неправильные действия с Nginx.
Вот моя Бог конфигурация:
# God configuration
APP_ROOT = File.expand_path '../', File.dirname(__FILE__)
God.watch do |w|
w.name = "app_name"
w.interval = 30.seconds # default
w.start = "cd #{APP_ROOT} && unicorn -c #{APP_ROOT}/config/unicorn.rb -D"
# -QUIT = graceful shutdown, waits for workers to finish their current request before finishing
w.stop = "kill -QUIT `cat #{APP_ROOT}/tmp/unicorn.pid`"
w.restart = "kill -USR2 `cat #{APP_ROOT}/tmp/unicorn.pid`"
w.start_grace = 10.seconds
w.restart_grace = 10.seconds
w.pid_file = "#{APP_ROOT}/tmp/unicorn.pid"
# User under which to run the process
w.uid = 'web'
w.gid = 'web'
# Cleanup the pid file (this is needed for processes running as a daemon)
w.behavior(:clean_pid_file)
# Conditions under which to start the process
w.start_if do |start|
start.condition(:process_running) do |c|
c.interval = 5.seconds
c.running = false
end
end
# Conditions under which to restart the process
w.restart_if do |restart|
restart.condition(:memory_usage) do |c|
c.above = 150.megabytes
c.times = [3, 5] # 3 out of 5 intervals
end
restart.condition(:cpu_usage) do |c|
c.above = 50.percent
c.times = 5
end
end
w.lifecycle do |on|
on.condition(:flapping) do |c|
c.to_state = [:start, :restart]
c.times = 5
c.within = 5.minute
c.transition = :unmonitored
c.retry_in = 10.minutes
c.retry_times = 5
c.retry_within = 2.hours
end
end
end
Вот моя конфигурация Unicorn:
# Unicorn configuration file
APP_ROOT = File.expand_path '../', File.dirname(__FILE__)
worker_processes 8
preload_app true
pid "#{APP_ROOT}/tmp/unicorn.pid"
listen 8001
stderr_path "#{APP_ROOT}/log/unicorn.stderr.log"
stdout_path "#{APP_ROOT}/log/unicorn.stdout.log"
before_fork do |server, worker|
old_pid = "#{APP_ROOT}/tmp/unicorn.pid.oldbin"
if File.exists?(old_pid) && server.pid != old_pid
begin
Process.kill("QUIT", File.read(old_pid).to_i)
rescue Errno::ENOENT, Errno::ESRCH
# someone else did our job for us
end
end
end
Я проверил журналы состояния Бога, но кажется, что ЦП и использование памяти никогда не выходят за пределы. У меня также есть кое-что, чтобы убить работников с большим объемом памяти, которые можно найти на странице блога GitHub здесь.
Когда работает tail -f
в журналах "Единорога" я вижу некоторые запросы, но их далеко и мало между тем, когда я находился на скорости около 60–100 секунд, прежде чем казалось, что эта проблема пришла. Этот журнал также показывает, что работники пожинаются и запускаются, как и ожидалось.
Итак, мой вопрос: как мне отладить это? Какие следующие шаги я должен предпринять? Я крайне озадачен тем, что сервер иногда реагирует быстро, но в другое время он очень медленный в течение длительных периодов времени (которые могут быть или не быть пиковыми временами трафика).
Любой совет высоко ценится.
1 ответ
Я бы начал с рассмотрения общего состояния системы с помощью подобных инструментов. Далее я бы внимательно посмотрел на то, что делает Postgres. Если это не выявит проблему, я бы использовал tcpdump (или более хороший tshark) для просмотра связи между вашим браузером, ngnix и единорогом. В связи с этим я бы попробовал натянуть на nginx и единорога.