Activar YJIT mediante Template no funciona

Hola,

Administro una instalación de Discourse autoalojada (2026.5.0-latest). Hoy intenté activar YJIT. Añadí "templates/enable-ruby-yjit.yml" a containers/app.yml y reconstruí la aplicación.

Una vez finalizada la reconstrucción, ocurrió algo interesante. Dentro del contenedor Docker, ejecuté env | grep RUBY_YJIT_ENABLE y obtuve RUBY_YJIT_ENABLE=1. Hasta ahí todo bien. Pero luego ejecuté sudo -u discourse RAILS_ENV=production bundle exec rails runner 'puts "YJIT enabled: #{RubyVM::YJIT.enabled?}"; puts RUBY_DESCRIPTION'… y obtuve:

YJIT enabled: false

ruby 3.4.7 (2025-10-08 revision 7a5688e2a2) +PRISM [x86_64-linux] 

Por lo tanto, YJIT no se activó, a pesar de haber añadido la plantilla enable-ruby-yjit.yml. Entonces, cuando ejecuté sudo -u discourse RAILS_ENV=production bundle exec rails runner 'puts "GlobalSetting.yjit_enabled=#{GlobalSetting.yjit_enabled}"', obtuve GlobalSetting.yjit_enabled= — ¡un valor nulo!

En cualquier caso, después de experimentar un poco más con ello, finalmente logré activar YJIT añadiendo lo siguiente a containers/app.yml:

env:
  DISCOURSE_YJIT_ENABLED: true

Estoy seguro de que hay un error en algún lugar (GlobalSetting.yjit_enabled no debería devolver nunca nil), pero establecer la variable de entorno funcionó, y espero que alguien que busque esto en Google encuentre este tema.

1 me gusta

¿No es eso un mal diagnóstico? Estás comprobando el entorno de un proceso Ruby recién creado en lugar del que ejecuta el servidor web real.

Si inspeccionas /proc/<pid>/environ del proceso Pitchfork, verás la variable de entorno YJIT allí.

root@raspberrypi5:/var/discourse# cat /proc/3331660/environ | tr '\0' '\n' | grep -i yjit
RUBY_YJIT_ENABLE=1

Observar la presencia de una variable de entorno no te dice nada sobre si Ruby se está ejecutando actualmente con YJIT habilitado. En este caso particular, la variable de entorno está definida, pero algo más estaba sobrescribiendo la variable que Rails utiliza para habilitar (o deshabilitar) YJIT al iniciar. No hay otra explicación para que GlobalSetting.yjit_enabled= devuelva nil, incluso en una nueva instancia de Rails. Tampoco hay ninguna razón por la cual YJIT deba estar desactivado en una nueva instancia de Rails.

Después de agregar la variable de entorno DISCOURSE_YJIT_ENABLED a mi containers/app.yml:

  1. sudo -u discourse RAILS_ENV=production bundle exec rails runner 'puts "YJIT enabled: #{RubyVM::YJIT.enabled?}"; puts RUBY_DESCRIPTION' devuelve YJIT enabled: true
  2. El uso de memoria en mi servidor finalmente aumenta un poco.
  3. Observo una mejora real de velocidad en mi foro.

Debería ser fácil replicar mis hallazgos. Solo agrega la plantilla y compruébalo.