Le migliori configurazioni per velocizzare Discourse standalone

Il nostro sito Discourse conta oltre 10.000 utenti e circa 700 utenti attivi giornalieri, con una media di 10.000 post inviati al giorno. La nostra community registra oltre 160.000 visualizzazioni di pagina al giorno, inclusi crawler e utenti anonimi. Quasi tutti i nostri utenti si connettono tramite dispositivi mobili.

Abbiamo eseguito la community in modalità standalone su un singolo VPS con 16 core CPU e 24 GB di RAM, configurando app.yml con questi valori:

params:
  db_shared_buffers: "6GB"
  db_work_mem: "50MB"
env:
  UNICORN_WORKERS: 16

Stiamo utilizzando i seguenti plugin:

docker_manager
discourse-solved
discourse-adplugin
discourse-voting
discourse-push-notifications
discourse-whos-online
discourse-akismet
discourse-data-explorer
discourse-sitemap
discourse-telegram-notifications

Con la configurazione sopra indicata, alcuni utenti segnalano che il sito si carica lentamente per loro e, in alcune occasioni, durante l’invio di un post, lo schermo diventa bianco (l’intestazione rimane comunque visibile). Inoltre, durante le ore di punta, le prestazioni del sito rallentano talvolta.

Potete spiegare se abbiamo configurato male qualcosa o se sono necessarie più risorse?

Grazie mille :pray:

5 Mi Piace

10.000 post al giorno sono piuttosto tanti, considerando il numero di visualizzazioni di pagina. Posso immaginare che, data la tua configurazione, tu stia raggiungendo alcuni limiti di risorse e sospetto che il problema sia il database. Potresti provare a passare a un’architettura multi-container, scaricando di fatto i worker Unicorn dal server principale.

7 Mi Piace

Secondo la tua risposta, aumentare le risorse in questa configurazione non aiuta a risolvere il nostro problema? Ad esempio, 24 core CPU con 32 GB di RAM.

1 Mi Piace

Potrebbe benissimo essere, ma prima proverei a scalare in orizzontale tutto ciò che può essere scalato in orizzontale. Questo ti darà anche un’idea molto più chiara di dove si trova il collo di bottiglia.

La maggior parte dei problemi di prestazioni può essere risolta semplicemente aggiungendo più risorse al problema. La parte difficile è farlo in modo intelligente, in modo da risparmiare qualche euro (o potenzialmente molto denaro).

10 Mi Piace

Grazie per la tua competenza e i tuoi consigli amichevoli; leggerò sicuramente come implementare questa soluzione. Un’altra domanda che ho è: quali impostazioni dovrebbero essere applicate nell’app per le specifiche che ho menzionato sopra (24 core CPU con 32 GB di RAM)?

Le impostazioni attuali sono appropriate o è meglio aumentare i valori?

3 Mi Piace

Difficile dirlo senza ispezionare il sistema e vedere cosa sta succedendo.

Dato che hai detto che la maggior parte dei problemi si verificano durante l’invio di un post, il problema è probabilmente legato alla scrittura sul database e non credo che aumentare ulteriormente shared buffers sarà di grande aiuto, ma puoi provare. Ho visto che viene portato a oltre il 50% della memoria (contro ogni consiglio), quindi potresti provare ad aumentarlo gradualmente fino a 12 GB.
Se non stai riscontrando errori 502, non ha senso aumentare nemmeno UNICORN_WORKERS.

4 Mi Piace

Non hai menzionato il suo utilizzo, quindi penso che la prima cosa da fare sia aggiungere una CDN; questo ridurrebbe notevolmente il carico sul VPS, poiché le richieste più pesanti non raggiungerebbero il server.

Oltre alla CDN, ti consiglierei anche di optare per un archivio simile a S3, che ti permetterebbe di scalare separatamente lo storage e le risorse del VPS (se la tua community è ricca di upload).

Queste raccomandazioni aiutano molto a ridurre il carico, e l’aumento di prezzo è molto inferiore rispetto all’acquisto di un VPS più grande.

2 Mi Piace

Grazie @marianord, purtroppo non utilizziamo un CDN. La velocità di caricamento nel nostro forum non è molto elevata. La maggior parte delle volte, gli utenti discutono di vari argomenti. Ad esempio, nell’ultimo anno abbiamo avuto circa 2,8 milioni di post e 2,7 milioni di like, ma solo 25 GB di file caricati.

Pensi che, in base alle informazioni che ho fornito, l’utilizzo di un CDN come S3 possa ridurre il carico sul nostro server?

Non sono d’accordo con @marianord. Non penso che un CDN farebbe una differenza significativa rispetto al carico sul tuo server.
Si tratta solo di file statici e non sono affatto pesanti da servire.

1 Mi Piace

CDN e S3 sono due cose diverse.

  • S3 scarica i file e i backup su un altro server gestito da un provider cloud (una sintesi molto generale)
  • La CDN memorizza nella cache i file statici del tuo server (immagini, JS, CSS) per servire da più server (PoP) in tutto il mondo, accelerando il caricamento di queste risorse.

Almeno questa è la mia esperienza: riduci il numero di richieste che arrivano al tuo server, diminuendo così il carico. È molto più semplice servire solo 10 richieste JSON per utente rispetto a 100 richieste per utente.

Forse questo non risolverà tutti i problemi che sta affrontando @nildarar, ma ridurrà il carico pesante sul server eliminando tutte le richieste statiche (quelle in cache) dal server Discourse.

3 Mi Piace

Una richiesta per un file statico non ha un impatto significativo sul carico complessivo del server. Le richieste per contenuti dinamici sono quelle più pesanti.

In generale, una richiesta json non è una risorsa statica che verrà memorizzata nella cache di una CDN. Si tratta di contenuti dinamici generati al volo. Perché stai parlando di file JSON in un contesto CDN?

richieste statiche ≠ carico più pesante.

Mi dispiace, ma questo è davvero un consiglio pessimo.

Questo è un esempio proveniente da una macchina con 6 CPU (quindi la CPU totale arriva al 600%) che esegue Discourse senza CDN o S3.

Puoi vedere che nginx è responsabile solo del 6,7% (quindi è 1/100 della capacità). Solo una parte di ciò è utilizzata per le risorse statiche.

Se dovessimo delegare le risorse statiche a S3 e/o a una CDN, ridurremmo il carico complessivo del server di meno dell’uno percento.

3 Mi Piace

Vero, ma Discourse ha alcune eccezioni, come i fogli di stile serviti da Ruby, quindi avere una CDN con caching significa che quelle richieste non consumano i processi Unicorn.

Per quanto riguarda il problema dell’OP, la prima cosa necessaria è che una persona esperta esegua un’analisi delle prestazioni durante le ore di punta e identifichi qual è l’attuale collo di bottiglia.

7 Mi Piace

Sto dicendo che le richieste JSON colpiranno il server, mentre quelle statiche no.

1 Mi Piace

Grazie per la tua guida. Fino a qualche mese fa utilizzavamo il servizio CDN di Cloudflare e abbiamo apportato modifiche efficaci ai contenuti statici tramite le regole delle pagine. In seguito, ho letto da qualche parte che l’uso di proxy come Cloudflare riduce drasticamente le prestazioni di Discourse, quindi lo abbiamo disabilitato.

Ieri abbiamo aumentato i core della CPU da 16 a 24 e apportato le seguenti modifiche al file app.yml:

params:
  # db_shared_buffers: "6GB"
  db_shared_buffers: "7GB"
env:
  # UNICORN_WORKERS: 16
  UNICORN_WORKERS: 24

Con queste modifiche, il nostro problema è stato risolto temporaneamente, ma credo che dovremo apportare un cambiamento fondamentale nei prossimi mesi.

Quindi, secondo le tue raccomandazioni, l’uso di una CDN per servire i contenuti statici e la divisione di Discourse in due container separati hanno la priorità più alta per il miglioramento delle prestazioni.

1 Mi Piace

Queste informazioni potrebbero essere datate, ma ricordo di aver letto che Discourse preferisce un numero inferiore di CPU più potenti rispetto a un numero maggiore di CPU meno potenti… anche se si aggiorna il numero di worker unicorni.

@codinghorror, puoi confermare se queste informazioni sono ancora corrette?

3 Mi Piace

Sì, è corretto: la potenza della CPU è importante, ma migliora la velocità complessiva.

@nildarar sta riscontrando un collo di bottiglia nelle prestazioni e ciò richiede un approccio diverso.

5 Mi Piace

Ci sono strumenti speciali per identificare i colli di bottiglia nelle prestazioni del discorso?


Scherma di htop ordinato per utilizzo della CPU

Prevediamo che l’anno prossimo il numero dei nostri utenti triplicherà, quindi da oggi dobbiamo fornire le risorse necessarie per questa scala.

Utilizzare qualcosa come Prometheus + Grafana può aiutarti a ottenere solo lo storico dei dati, invece di vederli in tempo reale e poi effettuare un’analisi più approfondita di ciò che sta accadendo.

4 Mi Piace

Ciao di nuovo :waving_hand:
Seguendo i vostri consigli, abbiamo installato Prometheus e monitorato le prestazioni della community per un po’. Vi preghiamo di consultare i rapporti qui sotto e confrontarli con i valori che rilevate nelle diverse installazioni.

4 Mi Piace

Ho letto recentemente in un altro post che un sito ha rimosso il plugin Who’s Online perché era la causa della lentezza.

Ecco il link: Benefits of the who's online plugin? - #6 by neounix

3 Mi Piace