تمكين YJIT عبر القالب لا يعمل

مرحبًا،

أدير تثبيتًا خاصًا بـ Discourse (الإصدار 2026.5.0-latest). اليوم حاولت تفعيل YJIT. أضفت "templates/enable-ruby-yjit.yml" إلى containers/app.yml وأعدت بناء التطبيق.

بعد اكتمال إعادة البناء، حدث شيء مثير للاهتمام. داخل حاوية Docker، شغلت الأمر env | grep RUBY_YJIT_ENABLE وحصلت على النتيجة RUBY_YJIT_ENABLE=1. حتى الآن كل شيء على ما يرام. لكن عند تشغيل الأمر sudo -u discourse RAILS_ENV=production bundle exec rails runner 'puts "YJIT enabled: #{RubyVM::YJIT.enabled?}"; puts RUBY_DESCRIPTION' … حصلت على:

YJIT enabled: false

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

إذًا لم يتم تفعيل YJIT رغم إضافة قالب enable-ruby-yjit.yml. ثم، عند تشغيل الأمر sudo -u discourse RAILS_ENV=production bundle exec rails runner 'puts "GlobalSetting.yjit_enabled=#{GlobalSetting.yjit_enabled}"' حصلت على GlobalSetting.yjit_enabled= — قيمة فارغة (nil)!

على أي حال، بعد بعض التجارب الإضافية، تمكنت أخيرًا من تفعيل YJIT بإضافة ما يلي إلى containers/app.yml:

env:
  DISCOURSE_YJIT_ENABLED: true

أعتقد أن هناك خللًا ما (GlobalSetting.yjit_enabled لا يجب أبدًا أن تُرجع قيمة فارغة)، لكن ضبط متغير البيئة نجح، وآمل أن يجد شخص ما يبحث في Google عن هذه المشكلة هذا الموضوع.

إعجاب واحد (1)

أليس ذلك تشخيصًا خاطئًا؟ أنت تتحقق من متغير البيئة (ENV) لعميل Ruby جديد تم إنشاؤه بدلاً من العميل الذي يشغل خادم الويب الفعلي.

إذا قمت بفحص /proc/<pid>/environ لعملية Pitchfork، فستجد متغير البيئة YJIT هناك.

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

مجرد النظر إلى وجود متغير بيئة لا يخبرك بشيء حول ما إذا كان Ruby يعمل حاليًا مع YJIT مفعّل. في هذه الحالة بالذات، تم تعيين متغير البيئة، لكن شيئًا آخر كان يتسبب في تدمير المتغير الذي يستخدمه Rails لتفعيل (أو تعطيل) YJIT عند بدء التشغيل. لا يوجد أي تفسير آخر لسبب عودة GlobalSetting.yjit_enabled= بقيمة nil، حتى في مثيل Rails جديد. كما أنه لا يوجد سبب وجيه لتعطيل YJIT في مثيل Rails جديد.

بعد إضافة متغير البيئة DISCOURSE_YJIT_ENABLED إلى ملف containers/app.yml الخاص بي،

  1. sudo -u discourse RAILS_ENV=production bundle exec rails runner 'puts "YJIT enabled: #{RubyVM::YJIT.enabled?}"; puts RUBY_DESCRIPTION' يعيد YJIT enabled: true
  2. استهلاك الذاكرة على خادمي ارتفع أخيرًا قليلاً.
  3. ألاحظ تسريعًا حقيقيًا في المنتدى الخاص بي.

يجب أن يكون تكرار نتائجي أمرًا سهلاً. فقط أضف القالب وشاهد النتيجة.