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