تصحيح أخطاء نتائج ذاكرة التخزين المؤقت عن بُعد للتنفيذ عن بُعد

توضّح هذه الصفحة كيفية التحقّق من معدّل نتائج ذاكرة التخزين المؤقت وكيفية التحقيق في حالات تفويت ذاكرة التخزين المؤقت في سياق التنفيذ عن بُعد.

تفترض هذه الصفحة أن لديك إصدارًا و/أو اختبارًا يستخدم التنفيذ عن بُعد بنجاح، وأنك تريد التأكد من أنك تستخدم ذاكرة التخزين المؤقت عن بُعد بشكل فعّال.

التحقّق من معدّل نتائج ذاكرة التخزين المؤقت

في الإخراج العادي من البازل، انظر إلى سطر INFO الذي يسرد العمليات التي تتوافق تقريبًا مع إجراءات Bazel. تفاصيل هذا السطر حيث تم تنفيذ الإجراء. ابحث عن التصنيف remote الذي يشير إلى إجراء تم تنفيذه عن بُعد، وlinux-sandbox للإجراءات التي تم تنفيذها في وضع الحماية المحلي، وقيم أخرى لاستراتيجيات التنفيذ الأخرى. يتم عرض الإجراء الذي صدرت نتيجته من ذاكرة التخزين المؤقت البعيدة بالصيغة remote cache hit.

مثال:

INFO: 11 processes: 6 remote cache hit, 3 internal, 2 remote.

في هذا المثال، كانت هناك 6 نتائج لذاكرة التخزين المؤقت عن بُعد، ولم يتضمن إجراءان نتائج ذاكرة التخزين المؤقت وتم تنفيذها عن بُعد. يمكن تجاهل الجزء الثالث. وعادةً ما يكون ذلك إجراءات داخلية صغيرة، مثل إنشاء روابط رمزية. ولا يتم تضمين نتائج ذاكرة التخزين المؤقت المحلية في هذا الملخّص. إذا تلقّيت 0 عملية (أو عدد أقل من المتوقّع)، نفِّذ الأمر bazel clean متبوعًا بأمر build/test.

تحديد مشاكل نتائج ذاكرة التخزين المؤقت وحلّها

إذا كنت لا تحصل على معدل نتيجة ذاكرة التخزين المؤقت الذي تتوقعه، يمكنك إجراء ما يلي:

التأكّد من أن إعادة تشغيل أمر الإنشاء/الاختبار نفسه يؤدي إلى عرض نتائج ذاكرة التخزين المؤقت

  1. شغِّل الإصدارات و/أو الاختبارات التي تتوقّع تعبئة ذاكرة التخزين المؤقت فيها. وعند أول مرة تشغيل إصدار جديد على حزمة معينة، لا يمكنك توقع أي نتائج لذاكرة التخزين المؤقت عن بُعد. كجزء من التنفيذ عن بُعد، يتم تخزين نتائج الإجراءات في ذاكرة التخزين المؤقت ويجب أن يكتشفها التشغيل التالي.

  2. تشغيل bazel clean. يعمل هذا الأمر على محو ذاكرة التخزين المؤقت المحلية، مما يتيح لك التحقيق في نتائج ذاكرة التخزين المؤقت البعيدة بدون إخفاء النتائج عن طريق نتائج ذاكرة التخزين المؤقت المحلية.

  3. شغِّل الإصدارات واختبِر الاختبارات مرة أخرى (على الجهاز نفسه).

  4. تحقَّق من السطر INFO بحثًا عن معدل نتيجة ذاكرة التخزين المؤقت. إذا لم تظهر لك أي عمليات باستثناء remote cache hit وinternal، يعني ذلك أنّ ذاكرة التخزين المؤقّت لديك تتم تعبئتها بشكل صحيح ويتم الوصول إليها. وفي هذه الحالة، انتقل إلى القسم التالي.

  5. ومن المحتمل أن يكون أحد مصادر هذا التناقض عبارة عن عدم اتّساق في الإصدار، وبالتالي يؤدي ذلك إلى تلقّي الإجراءات على مفاتيح إجراء مختلفة خلال الوسيلتين. للعثور على هذه الإجراءات، اتّبِع الخطوات التالية:

    أ- أعِد تشغيل الإصدارات أو الاختبارات المعنيّة للحصول على سجلّات التنفيذ:

      bazel clean
      bazel --optional-flags build //your:target --execution_log_binary_file=/tmp/exec1.log
    

    ب- قارن سجلّات التنفيذ بين عمليتَي التشغيل. تأكد من أن الإجراءات متطابقة في ملفي السجلّ. وتوفّر التناقضات إشارة إلى التغييرات التي طرأت بين المسارات. حدِّث تصميم إعلانك لتجنُّب هذه التناقضات.

    إذا تمكنت من حل مشاكل التخزين المؤقت وتؤدي عملية إعادة التشغيل المتكررة إلى إنشاء جميع نتائج ذاكرة التخزين المؤقت، انتقل إلى القسم التالي.

    إذا كانت أرقام تعريف الإجراءات متطابقة ولكن ليست هناك أي نتائج لذاكرة التخزين المؤقت، هناك شيء في الضبط يمنع التخزين المؤقت. تابع من هذا القسم للتحقق من المشاكل الشائعة.

    إذا لم تكن بحاجة إلى اختلاف سجلات التنفيذ، يمكنك استخدام علامة --execution_log_json_file التي يمكن للمستخدمين قراءتها بدلاً من ذلك. ولا يمكن استخدام هذه العلامة للتمييز الثابت نظرًا لأنها تحتوي على وقت التنفيذ ولا تضمن الترتيب.

  6. تحقّق من أنّ جميع الإجراءات في سجلّ التنفيذ تم ضبطها على cacheable على "صحيح". إذا لم تظهر العلامة cacheable في سجلّ التنفيذ لأحد إجراءات "العطاء"، يعني ذلك أنّ القاعدة المقابلة قد تحتوي على علامة no-cache في تعريفها ضمن ملف BUILD. 158 اطّلِع على حقل progress_message القابل للقراءة في سجلّ التنفيذ للمساعدة على تحديد مصدر الإجراء.

  7. إذا كانت الإجراءات متطابقة مع cacheable ولكن لا توجد نتائج لذاكرة التخزين المؤقت، من الممكن أن يتضمن سطر الأوامر --noremote_accept_cached، ما سيؤدي إلى إيقاف عمليات البحث عن ذاكرة التخزين المؤقت لأحد الإصدارات.

    إذا كان تحديد سطر الأوامر الفعلي أمرًا صعبًا، استخدم سطر الأوامر الأساسي من إنشاء بروتوكول الحدث على النحو التالي:

    أ- إضافة --build_event_text_file=/tmp/bep.txt إلى أمر Bazel للحصول على النسخة النصية للسجل.

    ب- افتح النسخة النصية من السجلّ وابحث عن رسالة structured_command_line باستخدام command_line_label: "canonical". وسيؤدي ذلك إلى عرض جميع الخيارات بعد التوسيع.

    ج- ابحث عن remote_accept_cached وتحقّق من ضبطه على false.

    د- إذا كان remote_accept_cached هو false، حدِّد المكان الذي يتم فيه ضبطه على false: في سطر الأوامر أو في ملف bazelrc.

ضمان التخزين المؤقت عبر الأجهزة

وبعد حدوث نتائج ذاكرة التخزين المؤقت على النحو المتوقع على الجهاز نفسه، يتم تشغيل إصدار (إصدارات) الاختبار نفسه على جهاز مختلف. في حال الشك في عدم حدوث التخزين المؤقت على جميع الأجهزة، يمكنك تنفيذ ما يلي:

  1. عليك إجراء تعديل بسيط على الإصدار لتجنّب الوصول إلى ذاكرات التخزين المؤقت الحالية.

  2. شغِّل الإصدار على الجهاز الأول:

     bazel clean
     bazel ... build ... --execution_log_binary_file=/tmp/exec1.log
    
  3. شغِّل الإصدار على الجهاز الثاني، مع التأكد من تضمين التعديل من الخطوة 1:

     bazel clean
     bazel ... build ... --execution_log_binary_file=/tmp/exec2.log
    
  4. قارن سجلّات التنفيذ للتشغيلين. وإذا لم تكن السجلات متطابقة، يُرجى التحقّق من عمليات ضبط الإصدار عند حدوث تناقضات، بالإضافة إلى المواقع من بيئة المضيف التي تسرب إلى أي من الإصدارين.

مقارنة سجلات التنفيذ

تحتوي سجلّات التنفيذ على سجلّات بجميع الإجراءات التي تم تنفيذها أثناء الإصدار. وبالنسبة إلى كل إجراء، يتوفّر عنصر SpawnExec يحتوي على جميع المعلومات من مفتاح الإجراء، وبالتالي إذا كانت السجلات متطابقة، عندئذٍ تكون ذاكرة التخزين المؤقت للإجراء مَفَاتِيح

لمقارنة السجلات للإصدارين الذين لا يشتركان في نتائج ذاكرة التخزين المؤقت كما هو متوقع، يُرجى اتباع الخطوات التالية:

  1. يمكنك الحصول على سجلّات التنفيذ من كل إصدار وتخزينها كملفَي /tmp/exec1.log و/tmp/exec2.log.

  2. نزِّل رمز مصدر Bazel وانتقِل إلى مجلد Bazel باستخدام الأمر أدناه. يجب الحصول على رمز المصدر لتحليل سجلات التنفيذ باستخدام محلّل التنفيذ.

    git clone https://github.com/bazelbuild/bazel.git
    cd bazel
    
  3. استخدِم محلّل سجل التنفيذ لتنفيذ السجلات إلى نص. ويؤدي الاستدعاء التالي أيضًا إلى ترتيب الإجراءات في السجل الثاني لتطابق ترتيب الإجراء في السجل الأول من أجل تسهيل المقارنة.

    bazel build src/tools/execlog:parser
    bazel-bin/src/tools/execlog/parser \
      --log_path=/tmp/exec1.log \
      --log_path=/tmp/exec2.log \
      --output_path=/tmp/exec1.log.txt \
      --output_path=/tmp/exec2.log.txt
    
  4. استخدِم النص المفضّل لديك لتمييز /tmp/exec1.log.txt و/tmp/exec2.log.txt.