I run a self hosted Discourse install (2026.5.0-latest). Today I tried to turn YJIT on. I added "templates/enable-ruby-yjit.yml" to containers/app.yml and rebuilt the app.
After the rebuild was done, something interesting happened. Inside the Docker container, I ran env | grep RUBY_YJIT_ENABLE and got RUBY_YJIT_ENABLE=1. So far so good. But then I ran sudo -u discourse RAILS_ENV=production bundle exec rails runner 'puts "YJIT enabled: #{RubyVM::YJIT.enabled?}"; puts RUBY_DESCRIPTION' … I got:
So YJIT was not enabled, despite adding the enable-ruby-yjit.yml template. Then, when I ran sudo -u discourse RAILS_ENV=production bundle exec rails runner 'puts "GlobalSetting.yjit_enabled=#{GlobalSetting.yjit_enabled}"' I got GlobalSetting.yjit_enabled= — a nil value!
Anyway, after futzing around with it a bit more, I finally got YJIT enabled by adding the following to containers/app.yml:
env:
DISCOURSE_YJIT_ENABLED: true
I’m sure there’s a bug somewhere (GlobalSetting.yjit_enabledshouldn’t ever return nil) but setting the env variable worked, and I hope someone Googling for this will find this topic.
Looking at the presence of an env var doesn’t tell you anything about whether Ruby is currently running with YJIT enabled. In this particular case, the env var is set but something else was clobbering the variable Rails uses to enable (or disable) YJIT on startup! (Or at least … that’s my suspicion).
There’s no other explanation for why GlobalSetting.yjit_enabled= returns nil, even on a new Rails instance. There’s also no reason why YJIT should be turned off on a new Rails instance.
After adding the DISCOURSE_YJIT_ENABLED env var to my containers/app.yml,