Precompiling assets toma 20 minutos

Estoy reconstruyendo la imagen en una instancia de Digital Ocean y algo tarda una eternidad:

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

La instancia tiene 1 GB de RAM y por lo demás ejecuta Discourse sin problemas. ¿Estoy haciendo algo mal? ¿Puedo hacer algo para acelerar la reconstrucción? ¡Gracias!

1 me gusta

Creo que esto te dejará muy limitado en memoria ahora.

Está llegando al punto en que recomendaría un mínimo de 4 GB para una instancia de Discourse (¡más swap!) (incluso con 2 GB + 2 GB de swap, encuentro que las actualizaciones en línea son dolorosamente lentas).

3 Me gusta

¡Gracias! Desafortunadamente, eso es aproximadamente cuatro veces el precio por una mejora que probablemente solo sentiría durante las actualizaciones. Además, la guía de instalación en la nube todavía dice:

El valor predeterminado de 1 GB de RAM funciona bien para comunidades pequeñas de Discourse. Recomendamos 2 GB de RAM para comunidades más grandes.

¿Sabemos de dónde proviene la presión de memoria en este paso? ¿Quizás sería posible intercambiar una peor relación de compresión o algo por requisitos de memoria reducidos?

Proviene de ember-cli.

Ya estás experimentando una compensación entre tiempo y espacio (la falta de espacio en memoria hace que el proceso tarde más).

3 Me gusta

Tema relacionado:

1 me gusta

Creo que para mi próxima actualización en mis dos servidores, usaré la flexibilidad del proveedor de alojamiento para migrar a una RAM más grande antes de actualizar, y volver a migrar a mi mínimo actual inmediatamente después. Hay una pequeña cantidad de tiempo de inactividad adicional, pero si la reconstrucción es mucho más rápida, podría ser una victoria general. El gasto adicional debería ser inferior a 1 dólar o quizás incluso solo 1 centavo, por una hora de RAM adicional (en mi caso, de 6 dólares por mes a 12 dólares por mes, cobrado por hora en Digital Ocean a 1 y 2 centavos respectivamente).

Como se señaló en el hilo vinculado, a veces un reinicio es útil en cualquier caso, por lo que es un buen momento para actualizar los paquetes del sistema operativo y reiniciar, para mí.

Espero que esto también cause menos desgaste en mí.

De hecho, podría optar por pasar de 1G a 8G, lo que costará 6 centavos adicionales por hora, para darme la libertad de eliminar temporalmente mi archivo de intercambio y aliviar la escasez de espacio en disco.

Todo alcanza su punto máximo en el momento de la actualización; mientras tanto, la configuración mínima actual todavía parece ser adecuada.

Ciertamente puedo permitirme 6 centavos por ciclo de actualización.

4 Me gusta

¡Eso es genial! ¿Quién es tu proveedor de alojamiento?

Digital Ocean en un caso (1G RAM), Hetzner en el otro (2G RAM).

¿Ambos permiten aumentos temporales de RAM en línea y en el lugar?

¿O necesitas moverte entre “gotas”/instancias?

¿O solo un reinicio?

No,

Es apagar - redimensionar - iniciar - reconstruir - apagar - redimensionar de nuevo - iniciar

4 Me gusta

OK, pero todavía in situ. Es una gran opción, pero sí, es un inconveniente adicional… y tiempo de inactividad.

Dado que el tiempo de reconstrucción en una máquina de 1 GB lleva tanto tiempo, bien podrías hacer esto, ¡porque de todos modos estará inactiva durante 30 minutos!

Y claro, si estás preparado para hacer eso, incluso una actualización temporal de una máquina de 16 GB podría salir bien en cuanto a costes :slight_smile:

Sospecho que muchos considerarán que su tiempo es más valioso y probablemente deberían empezar a pensar en 4 GB o más de forma permanente.

1 me gusta

Ciertamente es parte de un compromiso entre costo y tiempo. Por mi parte, ya me he comprometido a dedicar una hora de cuidado de niños para las actualizaciones, y sé perfectamente cómo hacer este baile de administrador de sistemas, por lo que el tiempo ya está reservado. Prefiero mantener el costo operativo mensual lo más bajo posible, incluso si me lleva algo de tiempo; otros tendrán otros compromisos.

Sin duda, si gastar dinero es fácil, ¡consigue una instancia cómodamente grande!

1 me gusta

Solo como referencia, acabo de actualizar mis dos foros, ambos se completaron en menos de una hora, en ambos casos temporalmente aumenté a 8G de RAM y volví a la normalidad. Este paso en particular tomó unos 5 minutos, con (temporalmente) 4 CPUs y 8G de 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

Aquí vemos que ember (columna 12) está usando 2.5G de RAM (columna 6) y más de una CPU (columna 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>

Probablemente 4G de RAM habrían sido suficientes para mí, pero como se mencionó, todo este proceso solo costó unos pocos céntimos. (Ahora veo que podría haber elegido CPUs más rápidas por un céntimo adicional).

Edición: Tomé una copia de seguridad antes de empezar y otra después de que el trabajo se completó, y estuvieron separadas por 35 minutos. Así que el tiempo de inactividad visto por los usuarios no fue mayor que eso.

Edición: tenga en cuenta que el panel de control de Digital Ocean dice que la operación de redimensionamiento puede llevar hasta 1 minuto por GB de datos en el disco; en mi caso, solo 14G y, como resultó, solo 2 minutos por cada redimensionamiento. Pero si tiene una gran cantidad de datos en la instancia, este baile de redimensionamiento podría llevar más tiempo. (Por otro lado, si tiene una gran cantidad de datos, quizás no esté intentando ejecutarlo con menos de 4G de RAM).

3 Me gusta

4 GB de RAM todavía no son suficientes en algunos casos. Por ejemplo, tengo un entorno aislado (sandbox) de 8 GB de RAM sin prácticamente tráfico, pero es una configuración multisitio para permitir tener 5 entornos aislados desechables. La reconstrucción de hoy falló debido al Error 137 (OOM) y había probado el truco que @richard sugirió anteriormente. Sin embargo, para evitarme la molestia de hacer esto cada vez, he creado un intercambio (swap) más grande (4 GB) que parece haber permitido que las reconstrucciones ocurran por el momento. Parece que solo estamos actualizando servidores en el último año porque las reconstrucciones de Discourse realmente consumen mucha RAM por alguna razón.

2 Me gusta

Interesante. ¿Tienes la configuración del kernel como se describe en MKJ’s Opinionated Discourse Deployment Configuration?

(Siempre vale la pena tener swap, 2G o 4G o lo que el espacio libre en disco permita. Tengo un swap mínimo porque tengo un espacio en disco mínimo).

Pensando en esto, el beneficio se limita realmente a reconstrucciones completas: actualmente no puedo usar actualizaciones en línea en una configuración 2+2 :frowning: … y no creo que vaya a hacer este baile de actualización/reversión solo para actualizar, por ejemplo, un solo plugin …

Personalmente, siento que una actualización permanente a al menos 4 GB es la única manera …

Nota: Realmente no me estoy quejando de tener que adaptarme a los tiempos … ¿pero quizás deberíamos empezar a reflejar la realidad en la documentación y los consejos para los administradores?

Desafortunadamente, esto hace que Discourse sea un poco menos accesible para personas nuevas, especialmente jóvenes :thinking:

1 me gusta

De hecho, estoy de acuerdo con esta idea: mantener la configuración mínima recomendada actual como objetivo y buscar ajustes en el código o cambios anteriores para mantener las cosas bajo control. Es un cambio importante en la oferta si la configuración mínima ahora cuesta el doble. Por eso opiné en otro lugar que los requisitos excesivos de memoria son un error.

2 Me gusta

Ahora estoy recibiendo errores en las actualizaciones al intentar actualizar a la versión más reciente:

...[@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

Supongo que esto es un error de falta de memoria. ¿Significa que las máquinas de 1 GB están oficialmente obsoletas?

De hecho, ese es un error de falta de memoria. Si tienes espacio en disco para añadir swap, será suficiente, aunque el proceso llevará más tiempo que si añadieras RAM. Tu proveedor de hosting podría ofrecer la posibilidad de aumentar la RAM temporalmente y luego revertirla, lo que probablemente te costará un par de reinicios, un poco de tiempo de inactividad y unos pocos céntimos de coste adicional.

Edición: para ser claro, memoria = RAM + swap. La RAM es rápida y el swap es barato.

2 Me gusta