Consumo eccessivo di memoria dovuto alla precompilazione delle risorse

Ciao a tutti,

Grazie mille per tutti i consigli che ci avete fornito, sono molto apprezzati. Crediamo di aver individuato la causa principale dei recenti problemi di memoria.

In precedenza, l’esecuzione di bundle exec rake assets:precompile:build al momento della build (come root) non richiedeva né Redis né una connessione al database. Questo comportamento è cambiato (rif: Introducing pre-compiled JS assets for self-hosters e Introducing a new build system for plugins).

Per adattarci a questa situazione, abbiamo spostato il passaggio bundle exec rake assets:precompile:build in un container init durante l’esecuzione (prima di eseguire db:migrate, ecc.). Questo permette di eseguirlo come utente discourse, con l’accesso necessario ai servizi sia per Redis che per il database.

Tuttavia, durante l’esecuzione, il processo va in un loop in lib/plugin/js_manager.rb. Osservando ps -fe, vediamo che pnpm tenta ripetutamente di aggiungersi, portando alla saturazione della memoria:

...
discour+     704     688  5 11:00 pts/0    00:00:00 node /usr/bin/pnpm -C=frontend/asset-processor node build.js
discour+     718     704  5 11:00 pts/0    00:00:00 node /usr/bin/pnpm add pnpm@10.28.0 --loglevel=error --allow-build=@pnpm
discour+     729     718  6 11:00 pts/0    00:00:00 node /usr/bin/pnpm add pnpm@10.28.0 --loglevel=error --allow-build=@pnpm
discour+     740     729  6 11:00 pts/0    00:00:00 node /usr/bin/pnpm add pnpm@10.28.0 --loglevel=error --allow-build=@pnpm
discour+     754     740  7 11:00 pts/0    00:00:00 node /usr/bin/pnpm add pnpm@10.28.0 --loglevel=error --allow-build=@pnpm
...
# e l'elenco continua a crescere all'infinito, provocando la saturazione della memoria

Nei nostri test, abbiamo scoperto che eseguire il container init come root, seguito da npm uninstall -g pnpm e poi npm install -g pnpm@10.28.0, risolve il loop e permette alla compilazione dei plugin di completarsi con successo:

...
[Plugin::JsManager] Compiling 49 plugins...
[Plugin::JsManager] Finished initial compilation of plugins in 5.82s

Quindi, prima di sovradimensionare la nostra infrastruttura e probabilmente cambiare il nostro design, penso che questa domanda sia più per @david: ci sono piani per ripristinare il comportamento precedente per assets:precompile:build, in modo che possa essere eseguito senza Redis o una connessione al DB (simile a quanto si fa con il flusso DISCOURSE_DOWNLOAD_PRE_BUILT_ASSETS: 0)?

A margine, e per pura curiosità: perché l’esecuzione del processo node come utente non root innesca questo loop ricorsivo di installazione di pnpm, mentre l’esecuzione come root sembra evitarlo?

Un saluto,
Ismael