De repente, passou por enormes tempos de espera antes que os pedidos atingissem o servidor

4

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
    
por Bill Stites 16.03.2016 / 20:16

0 respostas