أدير تثبيتًا خاصًا بـ 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 رغم إضافة قالب 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 عن هذه المشكلة هذا الموضوع.
مجرد النظر إلى وجود متغير بيئة لا يخبرك بشيء حول ما إذا كان Ruby يعمل حاليًا مع YJIT مفعّل. في هذه الحالة بالذات، تم تعيين متغير البيئة، لكن شيئًا آخر كان يتسبب في تدمير المتغير الذي يستخدمه Rails لتفعيل (أو تعطيل) YJIT عند بدء التشغيل. لا يوجد أي تفسير آخر لسبب عودة GlobalSetting.yjit_enabled= بقيمة nil، حتى في مثيل Rails جديد. كما أنه لا يوجد سبب وجيه لتعطيل YJIT في مثيل Rails جديد.
بعد إضافة متغير البيئة DISCOURSE_YJIT_ENABLED إلى ملف containers/app.yml الخاص بي،
هذا غير صحيح. على مستوى Ruby، يُعد متغير البيئة أحد مفاتيح التبديل الرسمية، راجع الوثائق الرسمية لـ Ruby حول هذا الموضوع هنا:
هذا غير صحيح، لأن DISCOURSE_YJIT_ENABLED يغذي فقط GlobalSetting.yjit_enabled → config.yjit في config/application.rb. يستخدم Rails ذلك لتمكين YJIT إذا لم يكن مفعّلًا بالفعل. فهو لا يعطل YJIT المفعّل مسبقًا. لذا، عندما يكون متغير البيئة مُعيّنًا، فإن DISCOURSE_YJIT_ENABLED ليس له أي دور.
ولإثبات وجهة نظري أكثر، قمت بكتابة إضافة (plugin) تُرجع ما إذا كان YJIT مفعّلًا في عملية الويب الخاصة بي:
هاه! إذن أنت تقول إنه يمكننا الاعتماد على متغير البيئة للكشف عما إذا كان YJIT مفعّلاً! لم أكن أعرف ذلك؛ شكراً لك على رابط توثيق Ruby.
لكنني مشوش قليلاً بشأن شيء ما. كيف يمكن أن يكون من الممكن أن يُرجع الأمر env | grep RUBY_YJIT_ENABLE النتيجة RUBY_YJIT_ENABLE=1، بينما يُظهر مثيل Rails جديد في نفس الحاوية عند طلب طباعة #{RubyVM::YJIT.enabled?} النتيجة false؟ ألا يجب أن تُظهر النتيجة true لأن — كما ذكرت، يعمل متغير هذا البيئة على مستوى Ruby؟
من المحتمل أنك مشغول جداً، وهذا لا يهم، لذا لا داعي للرد. يجب أن أستطيع حل هذا بنفسي على خادمي. هل يمكنني الحصول على إضافتك، بالمناسبة؟ أريد طريقة لأكون متأكداً من أن خادم Discourse الخاص بي يعمل على Ruby مع تفعيل YJIT.