Abilitare YJIT tramite Template non funziona

Ciao,

Amministro un’installazione di Discourse in self-hosted (2026.5.0-latest). Oggi ho provato ad attivare YJIT. Ho aggiunto "templates/enable-ruby-yjit.yml" a containers/app.yml e ho ricostruito l’applicazione.

Dopo il completamento della ricostruzione, è successo qualcosa di interessante. All’interno del contenitore Docker, ho eseguito env | grep RUBY_YJIT_ENABLE e ho ottenuto RUBY_YJIT_ENABLE=1. Fin qui tutto bene. Ma poi ho eseguito sudo -u discourse RAILS_ENV=production bundle exec rails runner 'puts "YJIT enabled: #{RubyVM::YJIT.enabled?}"; puts RUBY_DESCRIPTION' … e ho ottenuto:

YJIT enabled: false

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

Quindi YJIT non era attivo, nonostante avessi aggiunto il template enable-ruby-yjit.yml. Poi, quando ho eseguito sudo -u discourse RAILS_ENV=production bundle exec rails runner 'puts "GlobalSetting.yjit_enabled=#{GlobalSetting.yjit_enabled}"', ho ottenuto GlobalSetting.yjit_enabled= — un valore nil!

Comunque, dopo averci smanettato un po’ di più, sono finalmente riuscito ad attivare YJIT aggiungendo quanto segue a containers/app.yml:

env:
  DISCOURSE_YJIT_ENABLED: true

Sono certo che ci sia un bug da qualche parte (GlobalSetting.yjit_enabled non dovrebbe mai restituire nil), ma impostare la variabile d’ambiente ha funzionato, e spero che qualcuno che cerca su Google per questo problema trovi questo argomento.

1 Mi Piace

Non è forse una diagnosi errata? Stai controllando l’ENV di un nuovo processo Ruby appena avviato invece di quello che esegue effettivamente il server web.

Se ispezioni /proc/<pid>/environ del processo Pitchfork, vedrai la variabile d’ambiente YJIT lì.

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

Osservare la presenza di una variabile d’ambiente non fornisce alcuna informazione su Ruby sia attualmente in esecuzione con YJIT abilitato. In questo caso specifico, la variabile d’ambiente è impostata, ma qualcos’altro stava sovrascrivendo la variabile che Rails utilizza per abilitare (o disabilitare) YJIT all’avvio. Non esiste altra spiegazione per cui GlobalSetting.yjit_enabled= restituisca nil, anche su una nuova istanza di Rails. Non c’è nemmeno motivo per cui YJIT dovrebbe essere disattivato su una nuova istanza di Rails.

Dopo aver aggiunto la variabile d’ambiente DISCOURSE_YJIT_ENABLED al mio file containers/app.yml:

  1. sudo -u discourse RAILS_ENV=production bundle exec rails runner 'puts "YJIT enabled: #{RubyVM::YJIT.enabled?}"; puts RUBY_DESCRIPTION' restituisce YJIT enabled: true
  2. L’utilizzo della memoria sul mio server è finalmente aumentato leggermente.
  3. Ho notato un reale aumento delle prestazioni sul mio forum.

Dovrebbe essere facile replicare i miei risultati. Basta aggiungere il template e verificare.