Nosso aplicativo da web tem recebido 20 mil a 30 mil visualizações por dia e está crescendo constantemente. Cerca de 4 dias atrás, de repente, começamos a ver tempos de espera de 30 a 40 segundos antes do HTML ser entregue, em páginas renderizadas em 1 segundo, mesmo no dia anterior.
No New Synthics sintéticos, esses momentos aparecem simplesmente como 'espera'. Ao monitorar os logs do nginx, vejo que esses horários correspondem a quanto tempo leva para que os pedidos recebidos atinjam o servidor.
Este é um aplicativo do Rails rodando Unicorn & Nginx em uma gotícula de 2 GB. Eu já otimizei minha configuração do Unicorn de acordo com este artigo: https://www.digitalocean.com/community/tutorials/how-to-optimize-unicorn-workers-in-a-ruby-on-rails-app, e nosso o uso de memória tende a pairar em torno de 50%. No entanto, também notei um monte deles na mesma saída de log acima:
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/"
O que, sem ter idéias melhores, imaginei que estamos conseguindo mais tráfego do que o número de funcionários do unicórnio pode suportar (nosso tráfego vem aumentando constantemente e tivemos o nosso dia mais movimentado no outro dia). Então eu atualizei a nossa gota para 4GB e dobrou o número de trabalhadores do Unicorn, mas isso não resolveu - às vezes eu vejo esses 11 erros, às vezes são 110.
Isso não é uma questão de otimização do meu código - as ações relevantes ainda levam de 1 a 2 segundos para serem processadas (por New Relic) assim que a solicitação finalmente for concluída, incluindo quaisquer consultas de banco de dados. O atraso está ocorrendo antes que a solicitação atinja o servidor. O uso da CPU de ambas as nossas gotas (servidor de aplicativos e banco de dados) está abaixo de 50%, assim como o uso de memória. Não há erros nos registros do Unicorn. Eu tentei todos os métodos que encontrei on-line de ajustes / otimização nginx & unicórnio e nada fez a diferença - se alguma coisa, os tempos de carga continuam a aumentar. Estamos vendo agora 40-50 segundo espera por pedidos a serem manipulados, o que efetivamente significa que nosso site está aleijado. Eu não tinha alterado nenhuma configuração ou código relevante por um longo tempo antes que isso começasse a acontecer. Revi meus arquivos relevantes para o que eles eram quando isso começou a acontecer, já que nenhum dos ajustes / alterações que fiz fez a diferença. Estou desesperado para que nosso site funcione de novo ... espero que alguém possa ajudar.
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: # Este arquivo é usado pelos servidores baseados em Rack para iniciar o aplicativo.
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
Tags nginx unicorn ruby-on-rails-3