การแก้ไขข้อบกพร่องของ Hit แคชระยะไกลสำหรับการดำเนินการระยะไกล

รายงานปัญหา ดูแหล่งที่มา

หน้านี้จะอธิบายวิธีตรวจสอบอัตราการพบแคชและวิธีตรวจสอบการไม่พบแคชในบริบทของการดำเนินการระยะไกล

หน้านี้จะถือว่าคุณมีบิลด์และ/หรือการทดสอบที่ใช้การดำเนินการระยะไกลได้สําเร็จ และคุณต้องการให้มั่นใจว่าใช้แคชระยะไกลได้อย่างมีประสิทธิภาพ

การตรวจสอบอัตราการพบแคช

ในเอาต์พุตมาตรฐานของการเรียกใช้ Bazel ให้ดูที่บรรทัด INFO ที่แสดงกระบวนการต่างๆ ซึ่งสอดคล้องกับการดำเนินการของ Bazel คร่าวๆ บรรทัดดังกล่าวจะแสดงรายละเอียด ตำแหน่งที่มีการดำเนินการ มองหาป้ายกำกับ remote ซึ่งระบุการดำเนินการที่ดำเนินการจากระยะไกล linux-sandbox สำหรับการดำเนินการในแซนด์บ็อกซ์ในเครื่อง และค่าอื่นๆ สำหรับกลยุทธ์การดำเนินการอื่นๆ การดำเนินการที่มีผลลัพธ์มาจากแคชระยะไกลจะแสดงเป็น remote cache hit

เช่น

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

ในตัวอย่างนี้มี Hit แคชระยะไกล 6 ครั้ง และการดำเนินการ 2 รายการไม่มี Hit ที่แคชไว้ และระบบได้ดำเนินการจากระยะไกล ส่วนภายใน 3 ส่วนสามารถเพิกเฉยได้ ซึ่งมักจะเป็นการกระทำภายในเล็กๆ น้อยๆ เช่น การสร้างลิงก์สัญลักษณ์ Hit ของแคชในเครื่องจะไม่รวมอยู่ในสรุปนี้ หากคุณได้รับกระบวนการ 0 รายการ (หรือตัวเลขต่ำกว่าที่คาดไว้) ให้เรียกใช้ bazel clean ตามด้วยคำสั่งบิลด์/การทดสอบ

การแก้ปัญหาการพบแคช

หากคุณไม่ได้รับอัตราการพบแคชตามที่คาดไว้ ให้ดำเนินการดังนี้

ตรวจสอบว่าการเรียกใช้คำสั่งบิลด์/การทดสอบเดียวกันอีกครั้งสร้าง Hit ของแคช

  1. เรียกใช้บิลด์และ/หรือการทดสอบที่คุณคาดว่าจะสร้างแคช ครั้งแรกที่มีการเรียกใช้บิลด์ใหม่ในกลุ่มสแต็กหนึ่ง คุณจะคาดการณ์ได้ว่าจะไม่มี Hit แคชระยะไกล ในฐานะส่วนหนึ่งของการดำเนินการระยะไกล ระบบจะจัดเก็บผลลัพธ์ของการดำเนินการไว้ในแคช และการเรียกใช้ครั้งต่อๆ ไปควรมีผล

  2. เรียกใช้ bazel clean คำสั่งนี้จะล้างแคชในเครื่อง ซึ่งจะช่วยให้คุณตรวจสอบ Hit แคชระยะไกลได้โดยที่ Hit แคชในเครื่องไม่มาสก์ผลลัพธ์

  3. เรียกใช้บิลด์และทดสอบบิลด์ที่คุณกำลังตรวจสอบอีกครั้ง (ในเครื่องเดียวกัน)

  4. ตรวจสอบบรรทัด INFO เพื่อดูอัตราการพบแคช หากไม่เห็นกระบวนการใดยกเว้น remote cache hit และ internal แสดงว่าแคชกำลังสร้างและเข้าถึงได้อย่างถูกต้อง ในกรณีนี้ ให้ข้ามไปที่หัวข้อถัดไป

  5. แหล่งที่มาของความคลาดเคลื่อนที่อาจเกิดขึ้นคือสิ่งที่ไม่คงที่ในบิลด์ ทำให้การดำเนินการได้รับคีย์การดำเนินการที่แตกต่างกันระหว่างการเรียกใช้ 2 ครั้ง หากต้องการค้นหาการดำเนินการเหล่านั้น ให้ทำดังนี้

    a. เรียกใช้บิลด์หรือการทดสอบที่เป็นปัญหาอีกครั้งเพื่อรับบันทึกการดำเนินการ ดังนี้

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

    b. เปรียบเทียบบันทึกการดำเนินการระหว่างการเรียกใช้ 2 ครั้ง ตรวจสอบว่าการดำเนินการในไฟล์บันทึกทั้ง 2 ไฟล์เหมือนกัน ความคลาดเคลื่อนจะให้ข้อมูลเกี่ยวกับการเปลี่ยนแปลงที่เกิดขึ้นระหว่างการเรียกใช้ อัปเดตบิลด์เพื่อกำจัดความคลาดเคลื่อนเหล่านั้น

    หากคุณแก้ไขปัญหาการแคชได้และตอนนี้การเรียกใช้ซ้ำทำให้เกิด Hit แคชทั้งหมด ให้ข้ามไปยังส่วนถัดไป

    หากรหัสการดำเนินการเหมือนกันแต่ไม่มี Hit จากแคช แสดงว่ามีบางอย่างในการกำหนดค่าป้องกันการแคช ดำเนินการต่อด้วยส่วนนี้เพื่อตรวจสอบ ปัญหาที่พบบ่อย

  6. ตรวจสอบว่าการดำเนินการทั้งหมดในบันทึกการดำเนินการตั้งค่า cacheable เป็น "จริง" แล้ว หาก cacheable ไม่ปรากฏในบันทึกการดำเนินการสำหรับการดำเนินการการให้สิทธิ์ หมายความว่ากฎที่เกี่ยวข้องอาจมีแท็ก no-cache อยู่ในคำจำกัดความในไฟล์ BUILD ดูช่อง mnemonic และ target_label ในบันทึกการดำเนินการเพื่อช่วยระบุว่าการดำเนินการนั้นมาจากที่ใด

  7. หากการดำเนินการเหมือนกันและ cacheable แต่ไม่มี Hit จากแคช อาจเป็นไปได้ว่าบรรทัดคำสั่งมี --noremote_accept_cached ซึ่งจะปิดใช้การค้นหาแคชสำหรับบิลด์

    หากหาบรรทัดคำสั่งจริงได้ยาก ให้ใช้บรรทัดคำสั่ง Canonical จากโปรโตคอลเหตุการณ์ดังนี้

    a. เพิ่ม --build_event_text_file=/tmp/bep.txt ในคำสั่ง Bazel เพื่อรับบันทึกเวอร์ชันข้อความ

    b. เปิดบันทึกเวอร์ชันข้อความและค้นหาข้อความ structured_command_line ด้วย command_line_label: "canonical" ซึ่งจะแสดงตัวเลือกทั้งหมดหลังการขยาย

    ค. ค้นหา remote_accept_cached แล้วตรวจสอบว่ามีการตั้งค่าเป็น false หรือไม่

    ง. หาก remote_accept_cached คือ false ให้ระบุตำแหน่งที่เป็น false ว่าจะตั้งค่าในบรรทัดคำสั่งหรือในไฟล์ bazelrc

ดูแลให้มีการแคชในเครื่องทุกเครื่อง

หลังจากที่ Hit แคชเกิดขึ้นอย่างที่คาดไว้ในเครื่องเดียวกัน ให้เรียกใช้บิลด์/การทดสอบเดียวกันในเครื่องเครื่องอื่น หากคุณสงสัยว่าไม่มีการแคชในคอมพิวเตอร์ ให้ทำดังนี้

  1. แก้ไขบิลด์ของคุณเล็กน้อยเพื่อหลีกเลี่ยงแคชที่มีอยู่

  2. เรียกใช้บิลด์ในเครื่องแรก:

     bazel clean
     bazel ... build ... --execution_log_binary_file=/tmp/exec1.log
    
  3. เรียกใช้บิลด์ในเครื่องที่ 2 เพื่อให้แน่ใจว่ามีการแก้ไขจากขั้นตอนที่ 1 รวมอยู่ด้วย ดังนี้

     bazel clean
     bazel ... build ... --execution_log_binary_file=/tmp/exec2.log
    
  4. เปรียบเทียบบันทึกการดำเนินการของการเรียกใช้ทั้ง 2 รายการ หากบันทึกไม่เหมือนกัน ให้ตรวจสอบการกำหนดค่าบิลด์เพื่อหาความคลาดเคลื่อน รวมถึงพร็อพเพอร์ตี้จากสภาพแวดล้อมโฮสต์ที่รั่วไหลไปยังบิลด์ใดบิลด์หนึ่ง

เปรียบเทียบบันทึกการดำเนินการ

บันทึกการดำเนินการมีบันทึกการดำเนินการทั้งหมดที่ดำเนินการระหว่างบิลด์ สำหรับการดำเนินการแต่ละรายการจะมีองค์ประกอบ SpawnExec ที่มีข้อมูลทั้งหมดจากคีย์การดำเนินการ ดังนั้นหากบันทึกเหมือนกัน คีย์แคชการดำเนินการก็จะเหมือนกัน

หากต้องการเปรียบเทียบบันทึกสำหรับบิลด์ 2 บิลด์ที่ไม่ได้แชร์ Hit แคชตามที่คาดไว้ ให้ทำดังนี้

  1. รับบันทึกการดำเนินการจากแต่ละบิลด์และจัดเก็บไว้เป็น /tmp/exec1.log และ /tmp/exec2.log

  2. ดาวน์โหลดซอร์สโค้ด Bazel และไปที่โฟลเดอร์ Bazel โดยใช้คำสั่งด้านล่าง คุณต้องมีซอร์สโค้ดเพื่อแยกวิเคราะห์บันทึกการดำเนินการด้วยโปรแกรมแยกวิเคราะห์ไฟล์ปฏิบัติการ

    git clone https://github.com/bazelbuild/bazel.git
    cd bazel
    
  3. ใช้โปรแกรมแยกวิเคราะห์บันทึกการดำเนินการเพื่อแปลงบันทึกเป็นข้อความ การเรียกใช้ต่อไปนี้จะจัดเรียงการดำเนินการในบันทึกที่ 2 ให้ตรงกับลำดับการดำเนินการในบันทึกแรกเพื่อให้เปรียบเทียบได้ง่ายด้วย

    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