'768 worker_connections non sono sufficienti' Errore

Ehi!

Da quando abbiamo ricostruito il sistema oggi, stiamo riscontrando un elevato numero di errori del server. Sembra trattarsi di un problema di connessione nginx; nel file nginx/error.log vedo talvolta raffiche di messaggi 768 worker_connections are not enough come questo:

2021/06/02 10:42:21 [alert] 1143#1143: *28468 1768 worker_connections are not enough while connecting to upstream, client: (IP rimossa), 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"

Avete idee su come possiamo risolvere il problema? Abbiamo abbondante CPU e memoria disponibili: potremmo aumentare il numero di ‘worker connections’?

Aggiornamento: ho aumentato temporaneamente le connessioni dei worker, ma continuo a ricevere questi errori (meno frequentemente e per un numero maggiore di worker). Sono davvero curioso di sapere se ci siano stati cambiamenti recenti che potrebbero causare questo problema o come potrei indagare meglio.

## Eventuali comandi personalizzati da eseguire dopo la compilazione
run:
  - exec: echo "Inizio dei comandi personalizzati"

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

È interessante che ciò sia accaduto dopo una ricostruzione. Hai eseguito recentemente azioni in massa? Ti consiglio di controllare i log di Sidekiq per vedere se sono presenti un gran numero di job anche lì.

Ho effettivamente eseguito alcune azioni in blocco di recente, poiché siamo passati alla TC di anteprima delle miniature, ma non c’è nulla nella mia coda Sidekiq, quindi posso escluderlo con certezza.

Abbiamo aggiornato la versione di nginx due giorni fa, quindi teniamola d’occhio. Il tuo sito riceve più di 500 visitatori contemporanei?

Inoltre, dato che l’intero sito è protetto da Cloudflare, le cose potrebbero essere diverse a causa di questo.

Non ne ho idea - forse sì? Hai qualche idea su come posso verificare?

Esatto. Ma ho disabilitato qualsiasi accelerazione e lo uso essenzialmente solo per memorizzare nella cache immagini e avatar. Non è mai stato un problema fino a oggi..

Haha, di solito le persone usano Google Analytics o qualcosa di simile per ottenere queste informazioni. La dashboard di Discourse mostra le visualizzazioni di pagina giornaliere e le visite degli utenti, che possono essere utilizzate anche per questo scopo.

Non è vero, l’intero tuo sito è servito tramite 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

Tuttavia, ciò potrebbe essere completamente irrilevante, poiché il tuo nginx sta segnalando problemi con le connessioni upstream invece che downstream, il che significa che sta esaurendo le connessioni tra nginx ⟷ unicorn.

Dato che manteniamo una connessione aperta per ogni visitatore a causa di message_bus (servizio di aggiornamenti in tempo reale), questo è in qualche modo atteso se il tuo sito è piuttosto popolare.

Aumentare worker_processes e worker_connections è sicuro e sembra avere senso nel tuo caso. Di default, worker_processes è impostato sul numero di core della tua CPU. Quanti core CPU hai?

Vero :slight_smile: L’abbiamo abbandonato molto tempo fa.. Abbiamo circa 250k visualizzazioni di pagina al giorno (inclusi i bot), quindi 500 non sembrano insoliti. Le visite degli utenti tracciano solo le visite degli utenti registrati, giusto?

Esatto - dobbiamo passare le nostre richieste attraverso CF, ma non permettiamo loro di toccare il nostro JavaScript, ecc.

Abbiamo 12 core, 64GB. Il carico tipico è circa 2, e utilizziamo il 50% della nostra RAM.

Mamma mia, è così strano!

La formula per le connessioni è worker_processes * worker_connections, che dovrebbe essere 12 * 768, ovvero (clic clack) 9216. Ma i tuoi log indicano 1768…

Prova questo nel tuo app.yml:

## Qualsiasi comando personalizzato da eseguire dopo la compilazione
run:
  - exec: echo "Inizio dei comandi personalizzati"

  - 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"

Tieni presente che il tuo blocco nel post 2 sta agendo sul file sbagliato!

:facepalm: Ho incollato il codice sbagliato: ho provato prima il modello di letsencrypt, ma ho finito per modificare nginx.conf impostando 1768 connessioni worker.

Proverò i tuoi valori: tornerò a riferirti come va.

Purtroppo li ricevo ancora:

2021/06/02 17:40:03 [alert] 2102#2102: *262491 2000 worker_connections non sono sufficienti durante la connessione all'upstream, client: <ip rimosso>, 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"

Ho aumentato worker_connections a 4000 e finora sembra tutto a posto :crossed_fingers:

Abbiamo reso più facile l’override ora:

Fantastico! Quindi faremmo qualcosa come

params:
  nginx_worker_connections: 4000

In app.yml/web_only.yml?

Esatto. Abbiamo anche aumentato il valore predefinito a 4k nella stessa patch, quindi gli amministratori potrebbero voler valutare attentamente se hanno ancora bisogno di aumentarlo.

Su un sito ho anche aumentato le CPU dei processi worker a 2X. Devo rimuovere anche quello?