استهلاك مفرط للذاكرة بسبب تجميع الأصول مسبقًا

مرحباً يا رفاق،

شكراً جزيلاً لكم على جميع النصائح التي قدمتموها لنا، نقدر ذلك كثيراً. نعتقد أننا حددنا السبب الجذري لمشاكل الذاكرة الأخيرة.

في السابق، لم يتطلب تشغيل أمر bundle exec rake assets:precompile:build أثناء البناء (بصلاحيات الجذر) وجود Redis أو اتصال بقاعدة البيانات. وقد تغير هذا السلوك (راجع: Introducing pre-compiled JS assets for self-hosters و Introducing a new build system for plugins).

للتكيف مع هذا التغيير، قمنا بنقل خطوة bundle exec rake assets:precompile:build إلى حاوية تهيئة (init container) تعمل وقت التشغيل (قبل تنفيذ db:migrate وما إلى ذلك). وهذا يسمح بتشغيلها باسم مستخدم discourse مع الوصول الضروري إلى كل من Redis وقاعدة البيانات.

ومع ذلك، أثناء التنفيذ، يدخل العملية في حلقة في lib/plugin/js_manager.rb. عند النظر إلى ps -fe، نرى أن pnpm يحاول إضافة نفسه بشكل متكرر، مما يؤدي إلى استنفاد الذاكرة:

...
discour+     704     688  5 11:00 pts/0    00:00:00 node /usr/bin/pnpm -C=frontend/asset-processor node build.js
discour+     718     704  5 11:00 pts/0    00:00:00 node /usr/bin/pnpm add pnpm@10.28.0 --loglevel=error --allow-build=@pnpm
discour+     729     718  6 11:00 pts/0    00:00:00 node /usr/bin/pnpm add pnpm@10.28.0 --loglevel=error --allow-build=@pnpm
discour+     740     729  6 11:00 pts/0    00:00:00 node /usr/bin/pnpm add pnpm@10.28.0 --loglevel=error --allow-build=@pnpm
discour+     754     740  7 11:00 pts/0    00:00:00 node /usr/bin/pnpm add pnpm@10.28.0 --loglevel=error --allow-build=@pnpm
...
# وتبدأ القائمة بالنمو وتستمر دون توقف، مما يتسبب في استنفاد الذاكرة

في اختباراتنا، وجدنا أن تشغيل حاوية التهيئة بصلاحيات الجذر بدلاً من ذلك، ثم تنفيذ npm uninstall -g pnpm يليه npm install -g pnpm@10.28.0، يحل المشكلة ويؤدي إلى إكمال تجميع الإضافة بنجاح:

...
[Plugin::JsManager] Compiling 49 plugins...
[Plugin::JsManager] Finished initial compilation of plugins in 5.82s

لذلك، قبل المبالغة في هندسة بنيتنا التحتية وربما تغيير تصميمنا، أعتقد أن هذا السؤال موجه أكثر إلى @david: هل توجد خطط لاستعادة السلوك السابق لـ assets:precompile:build بحيث يمكن تشغيله دون اتصال بـ Redis أو قاعدة بيانات (مشابه لما تفعله في تدفق DISCOURSE_DOWNLOAD_PRE_BUILT_ASSETS: 0

وفي جانب جانبي، ودافعاً عن الفضول: لماذا يؤدي تشغيل عملية node كمستخدم غير جذري إلى إحداث هذه الحلقة التكرارية لتثبيت pnpm، بينما يبدو أن التشغيل بصلاحيات الجذر يتجنبها؟

تحياتي،
إسماعيل