تمكين 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 عن هذه المشكلة هذا الموضوع.

أليس ذلك تشخيصًا خاطئًا؟ أنت تتحقق من متغير البيئة (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. ألاحظ تسريعًا حقيقيًا في المنتدى الخاص بي.

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

هذا غير صحيح. على مستوى Ruby، يُعد متغير البيئة أحد مفاتيح التبديل الرسمية، راجع الوثائق الرسمية لـ Ruby حول هذا الموضوع هنا:

هذا غير صحيح، لأن DISCOURSE_YJIT_ENABLED يغذي فقط GlobalSetting.yjit_enabledconfig.yjit في config/application.rb. يستخدم Rails ذلك لتمكين YJIT إذا لم يكن مفعّلًا بالفعل. فهو لا يعطل YJIT المفعّل مسبقًا. لذا، عندما يكون متغير البيئة مُعيّنًا، فإن DISCOURSE_YJIT_ENABLED ليس له أي دور.

ولإثبات وجهة نظري أكثر، قمت بكتابة إضافة (plugin) تُرجع ما إذا كان YJIT مفعّلًا في عملية الويب الخاصة بي:

https://discourse-on-a-pi5.falco.dev/ruby-info

أنت مُربك بشأن مفتاح التبديل على مستوى Rails، وهو غير ضروري لأننا نستخدم مفتاح التبديل على مستوى Ruby.

هاه! إذن أنت تقول إنه يمكننا الاعتماد على متغير البيئة للكشف عما إذا كان YJIT مفعّلاً! لم أكن أعرف ذلك؛ شكراً لك على رابط توثيق Ruby.

لكنني مشوش قليلاً بشأن شيء ما. كيف يمكن أن يكون من الممكن أن يُرجع الأمر env | grep RUBY_YJIT_ENABLE النتيجة RUBY_YJIT_ENABLE=1، بينما يُظهر مثيل Rails جديد في نفس الحاوية عند طلب طباعة #{RubyVM::YJIT.enabled?} النتيجة false؟ ألا يجب أن تُظهر النتيجة true لأن — كما ذكرت، يعمل متغير هذا البيئة على مستوى Ruby؟

من المحتمل أنك مشغول جداً، وهذا لا يهم، لذا لا داعي للرد. يجب أن أستطيع حل هذا بنفسي على خادمي. هل يمكنني الحصول على إضافتك، بالمناسبة؟ أريد طريقة لأكون متأكداً من أن خادم Discourse الخاص بي يعمل على Ruby مع تفعيل YJIT.

سأعلّم ردك كحل بعد أن أُكرّر التجربة.

شكراً مقدماً!

أعتذر، لقد تمكنت من حل المشكلة.

sudo -u discourse يقوم بتنظيف المتغيرات البيئية. استخدام العلم -E يعيد المتغيرات البيئية العادية، وفي هذه الحالة يُرجع الأمر sudo -E -u discourse RAILS_ENV=production bundle exec rails runner 'puts "YJIT enabled: #{RubyVM::YJIT.enabled?}"; puts RUBY_DESCRIPTION' النتيجة التالية:

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

مع إضافة القالب فقط.

أعتذر عن إضاعة وقتك، وقد قمت بوضع ردك كحل للمشكلة. عذراً على هذا. شكراً لك على التحقيق وعلى وقتك في الرد.