Memoria esaurita durante la rebuild con 4GB di swap?

Ho avuto diversi bootstrap di container doppi fallire oggi con errori come

 ERR_PNPM_RECURSIVE_EXEC_FIRST_FAIL  Comando terminato con SIGKILL (Terminazione forzata): ember build -prod"]

Penso che una volta aggiunto lo swap abbia funzionato la volta successiva. Ma questo ha 4GB di swap:

# free -h
               total        used        free      shared  buff/cache   available
Mem:           1.9Gi       1.1Gi       391Mi        45Mi       661Mi       830Mi
Swap:          4.0Gi       3.1Gi       911Mi

e sta ancora fallendo. E se fermo il container prima del bootstrap, ha successo.

1 Mi Piace

La build sta recuperando/utilizzando asset precompilati? O hai disabilitato questa funzione? (o hai modificato il core in modo che gli asset precompilati non possano essere utilizzati)

2 Mi Piace

Hai molta swap ma una grande parte è già in uso. Dato che una configurazione a due contenitori ha meno tempi di inattività, forse è vero che l’attuale invocazione del server è ancora in esecuzione e ha accumulato un uso elevato di memoria, forse a causa di una perdita (leak).

Forse un riavvio aiuterebbe, prima dell’aggiornamento. Forse misura l’uso della swap prima e dopo il riavvio.

3 Mi Piace

Ho una specie di perdita/espansione di memoria su uno dei miei server. Su suggerimento sensato di @RGJ, ho programmato un riavvio ogni 7 giorni il lunedì mattina presto (Europa occidentale) tramite cron.

(Crediamo di sapere quale plugin abbia il problema, ma non ho dedicato tempo a capire perché ci sia una perdita/espansione di memoria)

2 Mi Piace

Questo sembra un OOM kill: ho circa 2 GiB di RAM e nelle ricostruzioni a due container la vecchia app + la nuova build si sovrappongono spingendo la memoria oltre il limite. Lo swap è già utilizzato per circa 3 GiB prima dell’avvio, quindi lo spike della build di Ember riceve un SIGKILL. Interrompere il container in esecuzione (o eseguire una ricostruzione a container singolo) evita la sovrapposizione e ha successo. Il passo successivo è confermare tramite dmesg e quindi riavviare prima delle ricostruzioni / indagare cosa sta aumentando lo swap nel tempo / aggiungere RAM (lo swap da solo non sembra salvarlo una volta che è già pesantemente utilizzato).

1 Mi Piace

Questo sembra meno un problema di pnpm o Ember e più che l’host stia semplicemente esaurendo la memoria.

Il dettaglio chiave è il SIGKILL. Di solito significa che il sistema operativo è intervenuto e ha terminato il processo (spesso tramite l’OOM killer), non che ember build -prod sia fallito da solo.

Su host piccoli, le build di produzione di Ember possono facilmente raggiungere picchi di un paio di GB di RAM. Anche con lo swap abilitato, una volta che lo swap è quasi esaurito, il kernel può comunque decidere di terminare un processo node affamato di memoria.

Alcune cose che indicano questa direzione:

  • Lo swap è giĂ  pesantemente utilizzato quando si verifica il fallimento.
  • Il fallimento è molto piĂą probabile quando un altro container è in esecuzione contemporaneamente.
  • Se interrompo l’altro container prima di eseguire l’avvio (bootstrap), la stessa identica build ha successo.

Quindi lo swap aiuta un po’, ma per lo più ritarda solo il problema. L’arresto di altri container riduce la pressione sulla memoria quel tanto che basta affinché la build finisca.

Cosa ha aiutato / potrebbe aiutare:

  • Evitare di eseguire piĂą avvii (bootstrap) o build di asset in parallelo.
  • Arrestare altri container durante ember build -prod.
  • Limitare l’utilizzo della memoria di Node (ad esempio NODE_OPTIONS=--max_old_space_size=1024) per ridurre l’utilizzo di picco.
  • Se possibile, aumentare la RAM dell’host (4GB+) rende questo molto piĂą affidabile.

Spero che questo aiuti a spiegare perché sembra un po’ casuale e perché l’arresto di un altro container lo fa funzionare.

2 Mi Piace

Sembra che piĂą swap aiuterebbe. Non farebbe male. Invece di guardare lo swap totale e dire che sembra molto, guarda lo swap libero e assicurati di avere il margine per una ricostruzione.

2 Mi Piace

Verifica anche di aver abilitato l’overcommit.

Sembra una buona idea! Riavvi il server o solo il container?

Comunque, mi è successo di nuovo su un altro server da 2gb+3GB. Poi ho riavviato web_only e ho riprovato e ha funzionato perfettamente. Penso che aggiungerò al mio strumento la possibilità di riavviare web_only, forse se la memoria è al di sotto di una certa soglia.

Grazie a tutti per le vostre idee!

1 Mi Piace

L’intero server :sweat_smile:

2 Mi Piace

Non è Windows, per l’amor del cielo. :rofl:

2 Mi Piace

Oh ragazzi, ricordo quei giorni! :grimacing:

2 Mi Piace

Abbiamo riscontrato un caso in cui il riavvio di Linux ha aiutato. So che normalmente non è così che ci piace considerare Linux, ma c’è ancora la possibilità di frammentazione e c’è la possibilità di perdite di memoria.

2 Mi Piace