Наше веб-приложение получает 20-30 тысяч просмотров в день и неуклонно растет. Примерно 4 дня назад мы внезапно начали наблюдать время ожидания 30-40 секунд, прежде чем HTML был даже доставлен, на страницах, которые рендерились за 1 секунду даже накануне.
В New Relic Synthetics это время отображается просто как «ожидание». Наблюдая за журналами nginx, я вижу, что это время соответствует тому, сколько времени требуется входящим запросам, чтобы попасть на сервер.
Это приложение Rails, на котором запущены Unicorn и Nginx на 2 ГБ. Я ранее оптимизировал свою конфигурацию Unicorn в соответствии с этой статьей: https://www.digitalocean.com/community/tutorials/how-to-optimize-unicorn-workers-in-a-ruby-on-rails-app, и наши использование памяти обычно колеблется в районе 50%. Тем не менее, я также заметил кучу из них в том же журнале, приведенном выше:
2016/03/15 06:52:36 [error] 9460#0: *1110377 connect() to unix:/tmp/unicorn.streamfeed.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: 66.226.75.13, server: streamfeed.com, request: "GET /watch HTTP/1.1", upstream: "http://unix:/tmp/unicorn.streamfeed.sock:/watch", host: "streamfeed.com", referrer: "http://google.com/"
Что, не имея никаких лучших идей, я подумал, может означать, что мы получаем больше трафика, чем может выдержать наше количество сотрудников Unicorn (наш трафик неуклонно растет, и на днях у нас был самый загруженный день). Поэтому я обновил нашу дроплет до 4 ГБ и удвоил количество рабочих Unicorn, но это не помогло - иногда я вижу эти 11 ошибок, иногда 110.
Это не вопрос оптимизации моего кода - соответствующие действия по-прежнему занимают 1-2 секунды для фактической обработки (для New Relic), как только запрос, наконец, проходит, включая любые запросы к базе данных. Задержка возникает еще до того, как запрос попадет на сервер. Использование ЦП обеих наших капель (сервер приложений и база данных) составляет менее 50%, как и использование памяти. В логах Unicorn ошибок нет. Я перепробовал все найденные мной в Интернете методы настройки / оптимизации nginx и unicorn, и ничего не изменилось - во всяком случае, время загрузки продолжает увеличиваться. Теперь мы видим 40-50 секунд ожидания обработки запросов, что фактически означает, что наш сайт поврежден. Я очень давно не менял никаких соответствующих настроек или кода, прежде чем это началось. Я откатил свои соответствующие файлы к тому, чем они были, когда это началось, поскольку ни одна из настроек / изменений, которые я внес, не изменилась. Я отчаянно пытаюсь заставить наш сайт снова работать ... надеюсь, кто-то там может помочь.
nginx.conf:
upstream unicorn {
server unix:/tmp/unicorn.streamfeed.sock fail_timeout=0;
}
server {
server_name www.streamfeed.com;
rewrite ^(.*) http://streamfeed.com$1 permanent;
}
server {
listen 80 default_server deferred;
# server_name example.com;
server_name streamfeed.com;
root /home/deployer/apps/streamfeed/current/public;
location ^~ /assets/ {
gzip_static on;
expires max;
add_header Cache-Control public;
location ~* \.(js|css)$ {
add_header Access-Control-Allow-Origin *;
}
}
location ^~ /fonts/ {
gzip_static on;
expires max;
add_header Cache-Control public;
location ~* \.(ttf|ttc|otf|eot|woff|svg|font.css)$ {
add_header Access-Control-Allow-Origin *;
}
}
try_files $uri/index.html $uri @unicorn;
location @unicorn {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://unicorn;
}
error_page 500 502 503 504 /500.html;
client_max_body_size 4G;
keepalive_timeout 30;
}
unicorn.rb:
root = "/home/deployer/apps/streamfeed/current"
working_directory root
pid "#{root}/tmp/pids/unicorn.pid"
stderr_path "#{root}/log/unicorn.log"
stdout_path "#{root}/log/unicorn.log"
listen "/tmp/unicorn.streamfeed.sock"
worker_processes 11
timeout 60
config.ru: # Этот файл используется Rack-серверами для запуска приложения.
if ENV['RAILS_ENV'] == 'production'
require 'unicorn/worker_killer'
max_request_min = 500
max_request_max = 600
# Max requests per worker
use Unicorn::WorkerKiller::MaxRequests, max_request_min, max_request_max
oom_min = (240) * (1024**2)
oom_max = (260) * (1024**2)
# Max memory size (RSS) per worker
use Unicorn::WorkerKiller::Oom, oom_min, oom_max
end
require ::File.expand_path('../config/environment', __FILE__)
run Rails.application