Erro '768 worker_connections não são suficientes'

Olá!

Desde a reconstrução hoje, estamos enfrentando um alto número de erros no servidor. Parece ser um problema de conexão com o nginx; no nginx/error.log, às vezes vejo rajadas de mensagens como 768 worker_connections are not enough assim:

2021/06/02 10:42:21 [alert] 1143#1143: *28468 1768 worker_connections are not enough while connecting to upstream, client: (IP removido), server: _, request: "POST /message-bus/8fc08436f86f47479cf0dad3deb5c4dc/poll?dlp=t HTTP/1.1", upstream: "http://127.0.0.1:3000/message-bus/8fc08436f86f47479cf0dad3deb5c4dc/poll?dlp=t", host: "blenderartists.org", referrer: "https://blenderartists.org/t/convert-multiple-objects-to-single-mesh-with-vertex-grouping/489173/2"

Alguma ideia de como podemos resolver isso? Temos muita CPU/memória disponível — poderíamos aumentar o número de ‘worker connections’?

Atualização: por enquanto, aumentei as conexões do worker, mas ainda estou recebendo esses erros (com menos frequência e para um número maior de workers). Estou realmente curioso se algo mudou recentemente que possa ter causado isso ou como posso investigar melhor.

## Comandos personalizados para executar após a construção
run:
  - exec: echo "Início dos comandos personalizados"

  - replace:
      filename: "/etc/nginx/letsencrypt.conf"
      from: "worker_connections 768" 
      to: "worker_connections 1768"

É interessante que isso tenha acontecido após uma reconstrução. Você realizou alguma ação em massa recentemente? Eu verificaria os logs do Sidekiq para ver se há um grande número de jobs lá também.

Recentemente, tive algumas ações em massa, pois mudamos para a Visualização de Miniaturas TC, mas não há nada na minha fila do Sidekiq, então posso descartar essa possibilidade com certeza.

Atualizamos a versão do nginx há dois dias, então vamos ficar de olho. Você tem mais de 500 visitantes simultâneos no seu site?

Além disso, como todo o seu site está atrás do Cloudflare, as coisas podem ser diferentes por causa disso.

Não tenho ideia — talvez tenhamos? Alguma ideia de como posso verificar isso?

Correto. Mas desativei qualquer aceleração e estou basicamente usando apenas para armazenar em cache imagens e avatares. Nunca foi um problema até hoje..

Haha, geralmente as pessoas usam o Google Analytics ou algo assim para obter essas informações. O painel do Discourse também possui visualizações de página diárias e visitas de usuários que podem ser usadas para chegar a essa conclusão.

Não é verdade, todo o seu site é servido via Cloudflare:

curl -I https://blenderartists.org/                                                                                                                                         
HTTP/2 200 
cf-cache-status: DYNAMIC
cf-request-id: 0a6ef945b3000002fe272b2000000001
server: cloudflare
cf-ray: 6591c4b5ec5902fe-MIA
alt-svc: h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400, h3=":443"; ma=86400

Mas isso pode ser completamente irrelevante, já que seu nginx está reclamando de conexões upstream em vez de downstream, o que significa que ele está ficando sem conexões entre nginx ⟷ unicorn.

Como mantemos uma conexão aberta para cada visitante devido ao message_bus (serviço de atualizações em tempo real), isso é meio esperado se seu site for um pouco popular.

Aumentar o worker_processes e o worker_connections é seguro e parece fazer sentido no seu caso. Por padrão, definimos o worker_processes igual ao número de núcleos de CPU que você tem. Quantos núcleos de CPU você possui?

Verdade :slight_smile: Nós abandonamos isso há muito tempo… Temos cerca de 250 mil visualizações de página por dia (incluindo bots), então 500 não parece incomum. As visitas de usuários só rastreiam visitas de usuários logados, certo?

Certo — precisamos passar nossas requisições pela CF, mas não permitimos que eles mexam no nosso JavaScript, etc.

Temos 12 núcleos e 64 GB de RAM. A carga típica é de cerca de 2, e usamos 50% da nossa memória RAM.

Nossa, isso é muito estranho!

A fórmula para conexões é worker_processes * worker_connections, que seria 12 * 768, resultando em (clic clac) 9216. Mas seus logs indicam 1768…

Tente isso no seu app.yml:

## Quaisquer comandos personalizados para executar após a compilação
run:
  - exec: echo "Início dos comandos personalizados"

  - replace:
      filename: "/etc/nginx/nginx.conf"
      from: "worker_connections 768" 
      to: "worker_connections 2000"
  - replace:
      filename: "/etc/nginx/nginx.conf"
      from: "worker_processes auto" 
      to: "worker_processes 10"

Esteja ciente de que o bloco na postagem 2 está atuando sobre o arquivo errado!

:facepalm: Colei o código errado - tentei o modelo do letsencrypt primeiro, mas acabei alterando o nginx.conf para 1768 conexões de worker.

Vou testar os valores que você passou - volto para contar como ficou.

Ainda estou recebendo-os, receio:

2021/06/02 17:40:03 [alert] 2102#2102: *262491 2000 worker_connections são insuficientes ao conectar ao upstream, client: <ip removido>, server: _, request: "POST /message-bus/0e453fae0c604c29a876e6ede05b7341/poll?dlp=t HTTP/1.1", upstream: "http://127.0.0.1:3000/message-bus/0e453fae0c604c29a876e6ede05b7341/poll?dlp=t", host: "blenderartists.org", referrer: "https://blenderartists.org/t/weight-paint-not-painting/551282"

Aumentei worker_connections para 4000 e até agora está tudo bem :crossed_fingers:

Tornamos mais fácil de substituir agora:

Legal! Então faríamos algo como

params:
  nginx_worker_connections: 4000

Em app.yml/web_only.yml?

Exato. Também aumentamos o padrão para 4k no mesmo patch, então os administradores podem querer avaliar cuidadosamente se ainda precisam aumentá-lo.

Em um site, também aumentei os processos do trabalhador para 2x CPUs. Devo remover isso também?