Errori di memoria esaurita con plugin personalizzato

Qualcuno potrebbe fornire istruzioni per configurare l’allocazione della memoria?

Considerando i messaggi sporadici del kernel “out of memory”/dump, l’aumento di 3 volte dello swapping e il progressivo degrado della risposta dell’applicazione, sembra che la nostra app vada talvolta in carenza di memoria. Il nostro sistema ha attualmente 8 GB di RAM e 2 GB di swap. Di seguito i dettagli.

Ho esaminato le istruzioni per aggiungere più RAM fisica e swap su ("Cannot allocate memory" when upgrading), ma non sono riuscito a trovare dettagli su come allocarli.

Per quanto riguarda le configurazioni della memoria, stiamo utilizzando tutti i valori predefiniti. Il sistema si riprende dopo alcuni minuti, ma con l’aumento dell’utilizzo pensiamo sia il momento di informarci su come migliorare le prestazioni. Tuttavia, non sono sicuro di dove e come configurare questo aspetto. Aumentare la memoria allocata per l’istanza Docker o per il numero di unicorni Ruby (o entrambi)?

Sono un amministratore di sistema senza esperienza con Ruby e con esperienza limitata su Docker, quindi indicarmi la direzione del file di configurazione e la sintassi da usare mi sarebbe di grande aiuto.

Discourse 2.6.0 beta2
Ruby 2.3.1-2~ubuntu16.04.14
Ubuntu 16.04

Quante unicorni stai eseguendo? È impostato nel tuo file /var/discourse/containers/app.yml.

Ciao Rafael - Nella sezione “env” di app.yml, vedo che siamo configurati per utilizzare 4.

Hai rieseguito discourse-setup dopo aver aumentato la RAM? Questo aggiusterà di conseguenza le impostazioni di memoria. Puoi anche leggere i commenti in app.yml e modificarli.

Ricevere un OoM con soli 4 unicorni è davvero strano. Dovrebbe utilizzare circa 2 GB, lasciando 6 GB per PG e Redis.

È necessario indagare quale processo stia consumando tutta la memoria durante un evento OoM; questo non è normale.

Ciao Rafael e team, mi chiamo Serge e lavoro con il signor Happy Lee, che è appena partito per le tanto attese vacanze, quindi mi occuperò di questo problema.

Per aggiungere alla descrizione: il server è stato originariamente costruito con 8 GB di RAM e 2 GB di swap. Non l’abbiamo aggiornato da allora.

Nel log di sistema vedo prove che Ruby è il processo che consuma tutta la memoria e causa l’OoM del kernel:

Killed process 2960 (ruby) total-vm:10031472kB, anon-rss:7438148kB, file-rss:0kB

Non sono un esperto di Ruby, quindi non sono sicuro di come vedere quale processo in Ruby stia consumando tanta memoria.

Apprezzo qualsiasi suggerimento.

Grazie.

-Serge

Stai utilizzando dei plugin in questa installazione di Discourse?

Eseguiamo il plugin personalizzato Scheduled Digest, tuttavia funziona anche sulle nostre altre due installazioni e quelle non presentano problemi.

Puoi linkare qui il repository del codice sorgente di quel plugin?

Ciao Rafael,

il plugin è stato finanziato per lo sviluppo dalla nostra organizzazione, quindi purtroppo non sono autorizzato a esporre qui il codice sorgente. Inoltre, dato che il plugin funziona senza problemi su altre istanze, questo mi porta a pensare di aumentare le risorse di memoria del server per questa specifica istanza. La macchina è una VM, quindi posso facilmente raddoppiare la quantità di memoria e verificare se questo risolverà il problema.

Ok, in bocca al lupo!

Non c’è molto che possiamo fare per eseguire il debug di un codice che non possiamo vedere dal nostro lato. Potresti voler configurare il plugin Prometheus exporter per Discourse per monitorare le metriche della tua istanza.

Anche le altre istanze eseguono Ruby 2.3.1-2~ubuntu16.04.14?

Forse non è rilevante, ma:

Quindi era chiaramente un bug di Ruby. Abbiamo testato su più versioni di Ruby e abbiamo determinato che solo le versioni 2.3.x e 2.4.x presentavano la perdita di memoria (a quanto pare è stata risolta in Ruby 2.5.0****).

E la documentazione di Discourse richiede [Ruby 2.6+] :roll_eyes:

Grazie! Pubblicherò un aggiornamento non appena la situazione si stabilizzerà.

Ciao Benjamin, anche le altre istanze eseguono Ruby 2.3.1-2~ubuntu16.04.14; testerò un aggiornamento per verificare che non interrompa la nostra configurazione Docker.

La versione di Ruby non è rilevante in questo caso

Finché utilizzi la nostra immagine Docker ufficiale, userai la versione supportata corretta di Discourse