La precompilazione degli assets richiede 20 minuti

Sto ricostruendo l’immagine su un droplet Digital Ocean e qualcosa richiede un’eternità:

I, [2024-01-10T09:47:14.854311 #1]  INFO -- : cd /var/www/discourse & su discourse -c 'bundle exec rake themes:update assets:precompile'
Node.js heap_size_limit (492.75) is less than 2048MB. Setting --max-old-space-size=2048.
[WARN] (broccoli-terser-sourcemap) Minifying "assets/admin.js" took: 25461ms (more than 20,000ms)
[WARN] (broccoli-terser-sourcemap) Minifying "assets/plugins/chat.js" took: 47818ms (more than 20,000ms)
Purging temp files
Bundling assets
I, [2024-01-10T10:06:07.644096 #3264]  INFO -- : Writing /var/www/discourse/public/assets/break_string-cc617154cd957804f2f6a1f3bc68258c9cdca3d4b9a322bf777d145fed04790e.js

Il droplet ha 1 GB di RAM e altrimenti esegue Discourse senza problemi. Sto facendo qualcosa di sbagliato? Posso fare qualcosa per velocizzare la ricostruzione? Grazie!

1 Mi Piace

Credo che questo ti renderà molto limitato in termini di memoria ora.

Si sta arrivando al punto in cui consiglierei un minimo di 4 GB per un’istanza di Discourse (più swap!) (anche con 2 GB + 2 GB di swap trovo gli aggiornamenti online dolorosamente lenti).

3 Mi Piace

Grazie! Sfortunatamente, si tratta di circa quattro volte il prezzo per un miglioramento che probabilmente sentirei solo durante gli aggiornamenti. Inoltre, la guida all’installazione cloud dice ancora:

Il valore predefinito di 1 GB di RAM funziona bene per piccole community di Discourse. Si consigliano 2 GB di RAM per community più grandi.

Sappiamo da dove proviene la pressione sulla memoria in questo passaggio? Forse sarebbe possibile scambiare un rapporto di compressione peggiore o qualcosa del genere per requisiti di memoria ridotti?

Proviene da ember-cli.

Stai già sperimentando uno scambio tempo/spazio (la mancanza di spazio di memoria fa sì che il processo richieda più tempo).

3 Mi Piace

Argomento correlato:

1 Mi Piace

Penso che per il mio prossimo aggiornamento sui miei due server, userò la flessibilità del provider di hosting per migrare a una RAM più grande prima di aggiornare, e tornare alla mia attuale configurazione minima subito dopo. C’è una piccola quantità di tempo di inattività aggiuntivo, ma se la ricostruzione è molto più veloce, allora potrebbe essere un vantaggio complessivo. La spesa aggiuntiva dovrebbe essere inferiore a $1 o forse anche solo 1 centesimo, per un’ora di RAM extra (nel mio caso, da $6 al mese a $12 al mese, addebitati orariamente su Digital Ocean rispettivamente a 1 centesimo e 2 centesimi).

Come notato nel thread collegato, a volte un riavvio è utile in ogni caso, quindi è un buon momento per aggiornare i pacchetti del sistema operativo e riavviare, per me.

Spero che questo causi anche meno usura su di me.

Potrei infatti scegliere di passare da 1G a 8G, il che costerà 6 centesimi in più all’ora, per darmi la libertà di eliminare temporaneamente il mio file di swap e alleviare la carenza di spazio su disco.

Tutto raggiunge il picco al momento dell’aggiornamento - nel frattempo, la configurazione minima attuale sembra ancora adeguata.

Posso certamente permettermi 6 centesimi per ciclo di aggiornamento.

4 Mi Piace

È molto bello! Chi è il tuo provider di hosting?

Digital Ocean in un caso (1G RAM), Hetzner nell’altro (2G RAM).

Entrambi consentono aumenti temporanei della RAM online e in loco?

Oppure è necessario passare da “droplet”/istanze?

O solo un riavvio?

No,

È arresto - ridimensionamento - avvio - ricostruzione - arresto - ridimensionamento indietro - avvio

4 Mi Piace

OK, ma ancora in-place. È un’ottima opzione, ma sì, richiede più fatica… e tempi di inattività.

Considerando che il tempo di ricostruzione su una macchina da 1 GB richiede così tanto tempo che tanto vale fare questo, perché tanto sarà inattiva per 30 minuti!

E certo, se sei preparato a farlo, anche un aggiornamento temporaneo a una macchina da 16 GB potrebbe andare bene in termini di costi :slight_smile:

Sospetto che molti considereranno il proprio tempo più prezioso e dovrebbero probabilmente iniziare a pensare a 4 GB + su base permanente.

1 Mi Piace

È certamente parte di un compromesso tra costo e tempo. Per quanto mi riguarda, mi sono già impegnato a fare un’ora di babysitting per gli aggiornamenti, e so perfettamente come fare questa danza da sysadmin, quindi il tempo è già prenotato. Preferisco mantenere il costo di gestione mensile il più basso possibile, anche se mi richiede del tempo - altri avranno compromessi diversi.

Certamente, se spendere soldi è facile, prendi un’istanza comodamente grande!

1 Mi Piace

Solo per riferimento, ho appena aggiornato i miei due forum, entrambi completati entro un’ora, in entrambi i casi ho temporaneamente aumentato a 8G di RAM e poi di nuovo indietro. Questo particolare passaggio ha richiesto circa 5 minuti, con (temporaneamente) 4 CPU e 8G di RAM.

I, [2024-01-10T16:07:58.323464 #1]  INFO -- : cd /var/www/discourse && su discourse -c 'bundle exec rake themes:update assets:precompile'
110:M 10 Jan 2024 16:08:52.047 * 100 changes in 300 seconds. Saving...
110:M 10 Jan 2024 16:08:52.048 * Background saving started by pid 3276
3276:C 10 Jan 2024 16:08:52.384 * DB saved on disk
3276:C 10 Jan 2024 16:08:52.386 * Fork CoW for RDB: current 1 MB, peak 1 MB, average 0 MB
110:M 10 Jan 2024 16:08:52.449 * Background saving terminated with success
Purging temp files
Bundling assets
MaxMind IP database updates require a license
Please set DISCOURSE_MAXMIND_LICENSE_KEY to one you generated at https://www.maxmind.com
MaxMind IP database updates require a license
Please set DISCOURSE_MAXMIND_LICENSE_KEY to one you generated at https://www.maxmind.com
I, [2024-01-10T16:12:14.362017 #3300]  INFO -- : Writing /var/www/discourse/public/assets/break_string-cc617154cd957804f2f6a1f3bc68258c9cdca3d4b9a322bf777d145fed04790e.js

Qui vediamo che ember (colonna 12) sta usando 2,5G di RAM (colonna 6) e più di una CPU (colonna 3)

# ps auxfc|egrep -A29 containerd
root      1097  0.2  0.5 1510892 44924 ?       Ssl  16:00   0:01 containerd
root      4507  0.1  0.0 717892  7556 ?        Sl   16:03   0:00  \_ containerd-shim
root      4530  0.1  0.3 312292 30512 ?        Ssl  16:03   0:00      \_ pups
systemd+  4609  0.0  0.3 213236 28608 ?        S    16:03   0:00          \_ postmaster
systemd+  4617  0.0  0.8 213340 67288 ?        Ss   16:03   0:00          |   \_ postmaster
systemd+  4618  0.0  0.0 213236  5876 ?        Ss   16:03   0:00          |   \_ postmaster
systemd+  4619  0.0  0.1 213236 10076 ?        Ss   16:03   0:00          |   \_ postmaster
systemd+  4620  0.0  0.1 213904  8860 ?        Ss   16:03   0:00          |   \_ postmaster
systemd+  4621  0.0  0.0  68004  5592 ?        Ss   16:03   0:00          |   \_ postmaster
systemd+  4622  0.0  0.0 213796  7100 ?        Ss   16:03   0:00          |   \_ postmaster
message+  4682  0.2  0.4  87976 35724 ?        Sl   16:03   0:00          \_ redis-server
1000      7722  1.1  0.0      0     0 ?        Z    16:07   0:01          \_ esbuild <defunct>
root      7736  0.0  0.0   2476   520 ?        S    16:07   0:00          \_ sh
root      7737  0.0  0.0   9296  4156 ?        S    16:07   0:00          |   \_ su
1000      7738  8.3  0.0   2476   580 ?        Ss   16:07   0:12          |       \_ sh
1000      7835  0.4  0.9 929524 78416 ?        Sl   16:08   0:00          |           \_ node
1000      7857  0.0  0.0   2484   524 ?        S    16:08   0:00          |               \_ sh
1000      7858  156 30.5 67413228 2491796 ?    Sl   16:08   3:37          |                   \_ ember
1000      7876 39.0  1.7 11486300 145476 ?     Ssl  16:08   0:44          |                       \_ node
1000      7882 36.7  1.5 11466956 122648 ?     Ssl  16:08   0:41          |                       \_ node
1000      7889 37.1  4.1 11647592 340908 ?     Ssl  16:08   0:42          |                       \_ node
1000      7761  1.5  0.0      0     0 ?        Z    16:08   0:02          \_ esbuild <defunct>

Probabilmente 4G di RAM sarebbero stati sufficienti per me, ma come notato, tutto questo è costato solo pochi centesimi. (Ora vedo che avrei potuto scegliere CPU più veloci per un centesimo in più.)

Modifica: Ho fatto un backup prima di iniziare e un altro dopo che il lavoro era stato completato, e sono stati separati da 35 minuti. Quindi il tempo di inattività visto dagli utenti non è stato più lungo di quello.

Modifica: si noti che il pannello di controllo di Digital Ocean afferma che l’operazione di ridimensionamento può richiedere fino a 1 minuto per GB di dati sul disco - nel mio caso solo 14G e, come si è scoperto, solo 2 minuti per ogni ridimensionamento. Ma se hai una grande quantità di dati sull’istanza, questa operazione di ridimensionamento potrebbe richiedere più tempo. (D’altra parte, se hai una grande quantità di dati, forse non stai cercando di eseguirli con meno di 4G di RAM).

3 Mi Piace

4 GB di RAM non sono ancora sufficienti in alcuni casi. Ad esempio, ho un sandbox con 8 GB di RAM e traffico virtualmente nullo, ma è una configurazione multisito per consentire di avere 5 sandbox usa e getta. La ricostruzione di oggi è fallita a causa dell’Errore 137 (OOM) e avevo provato il trucco suggerito da @richard sopra. Tuttavia, per risparmiarmi la fatica di farlo ogni volta, ho creato uno swap più grande (4 GB) che sembra aver consentito le ricostruzioni per il momento. Sembra che stiamo solo aggiornando i server nell’ultimo anno perché le ricostruzioni di discourse stanno diventando davvero affamate di RAM per qualche motivo.

2 Mi Piace

Interessante. Hai le impostazioni del kernel come descritto in MKJ’s Opinionated Discourse Deployment Configuration?

(Vale sempre la pena avere dello spazio di swap, 2G o 4G o quanto consentito dallo spazio su disco libero. Ho uno swap minimo perché ho uno spazio su disco minimo.)

Pensandoci, il vantaggio è davvero limitato alle ricostruzioni complete: attualmente non posso utilizzare gli aggiornamenti online in una configurazione 2+2 :frowning: … e non credo che farò questa danza di aggiornamento/downgrade solo per aggiornare, ad esempio, un singolo plugin …

Personalmente ritengo che un aggiornamento permanente ad almeno 4 GB sia l’unica soluzione …

Nota: non mi sto lamentando del fatto di dover stare al passo con i tempi … ma forse dovremmo iniziare a riflettere la realtà nella documentazione e nei consigli agli amministratori?

Purtroppo rende Discourse un po’ meno accessibile alle persone nuove, specialmente ai più giovani :thinking:

1 Mi Piace

Sono in realtà d’accordo con questa idea: mantenere la configurazione minima consigliata attuale come obiettivo e cercare modifiche nel codice o modifiche upstream per tenere sotto controllo le cose. È un cambiamento importante nell’offerta se la configurazione minima ora costa il doppio. Ecco perché ho affermato altrove che requisiti di memoria eccessivi sono un bug.

2 Mi Piace

Ora sto riscontrando aggiornamenti non riusciti quando tento di aggiornare alla versione più recente:

...[@embroider/webpack]
Killed
error Command failed with exit code 137.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
Docker Manager: FAILED TO UPGRADE
#<RuntimeError: RuntimeError>
/var/www/discourse/plugins/docker_manager/lib/docker_manager/upgrader.rb:210:in `run'
/var/www/discourse/plugins/docker_manager/lib/docker_manager/upgrader.rb:111:in `upgrade'
/var/www/discourse/plugins/docker_manager/scripts/docker_manager_upgrade.rb:19:in `block in <main>'
/var/www/discourse/plugins/docker_manager/scripts/docker_manager_upgrade.rb:6:in `fork'
/var/www/discourse/plugins/docker_manager/scripts/docker_manager_upgrade.rb:6:in `<main>'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/railties-7.0.5.1/lib/rails/commands/runner/runner_command.rb:43:in `load'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/railties-7.0.5.1/lib/rails/commands/runner/runner_command.rb:43:in `perform'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/thor-1.2.2/lib/thor/command.rb:27:in `run'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/thor-1.2.2/lib/thor/invocation.rb:127:in `invoke_command'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/thor-1.2.2/lib/thor.rb:392:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/railties-7.0.5.1/lib/rails/command/base.rb:87:in `perform'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/railties-7.0.5.1/lib/rails/command.rb:48:in `invoke'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/railties-7.0.5.1/lib/rails/commands.rb:18:in `<main>'
internal:/usr/local/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb:37:in `require'
internal:/usr/local/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb:37:in `require'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/bootsnap-1.16.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
bin/rails:18:in `<main>'
Spinning up 1 Unicorn worker(s) that were stopped initially

Suppongo che si tratti di un errore di esaurimento della memoria? Significa che le macchine da 1 GB sono ufficialmente fuori uso?

In effetti si tratta di un errore di memoria insufficiente. Se hai spazio su disco sufficiente per aggiungere swap, questo sarà sufficiente, anche se il processo richiederà più tempo rispetto all’aggiunta di RAM. Il tuo provider di hosting potrebbe offrire la possibilità di aumentare temporaneamente la RAM e poi ripristinarla, il che probabilmente ti costerà un paio di riavvii, un po’ di inattività e qualche centesimo di costo aggiuntivo.

Modifica: per essere chiari, memoria = RAM + swap. La RAM è veloce e lo swap è economico.

2 Mi Piace