หน้านี้อธิบายวิธีตรวจสอบอัตราการพบแคชและวิธีตรวจสอบการไม่พบแคชในบริบทของการดำเนินการจากระยะไกล
หน้านี้จะถือว่าคุณมีบิลด์และ/หรือการทดสอบที่ใช้การดำเนินการจากระยะไกลได้สำเร็จ และคุณต้องการตรวจสอบว่าคุณใช้แคชจากระยะไกลอย่างมีประสิทธิภาพ
การตรวจสอบอัตราการพบแคช
ในเอาต์พุตมาตรฐานของการเรียกใช้ Bazel ให้ดูบรรทัด INFO ที่แสดงรายการกระบวนการ ซึ่งโดยประมาณจะสอดคล้องกับการดำเนินการของ Bazel บรรทัดดังกล่าวจะแสดงรายละเอียดตำแหน่งที่ดำเนินการ มองหาป้ายกำกับ remote ซึ่งบ่งบอกถึงการดำเนินการจากระยะไกล, linux-sandbox สำหรับการดำเนินการในแซนด์บ็อกซ์ในเครื่อง และค่าอื่นๆ สำหรับกลยุทธ์การดำเนินการอื่นๆ การดำเนินการที่มีผลลัพธ์มาจากแคชจากระยะไกลจะแสดงเป็น remote cache hit
ตัวอย่างเช่น
INFO: 11 processes: 6 remote cache hit, 3 internal, 2 remote.
ในตัวอย่างนี้ มีการเข้าถึงแคชจากระยะไกล 6 ครั้ง และการดำเนินการ 2 รายการไม่เข้าถึงแคชและดำเนินการจากระยะไกล คุณสามารถละเว้นส่วนภายใน 3 ได้
โดยปกติแล้วจะเป็นการดำเนินการภายในขนาดเล็ก เช่น การสร้างลิงก์สัญลักษณ์ การเข้าถึงแคชในเครื่องจะไม่รวมอยู่ในข้อมูลสรุปนี้ หากคุณเห็นกระบวนการเป็น 0 (หรือตัวเลขต่ำกว่าที่คาดไว้) ให้เรียกใช้ bazel clean ตามด้วยคำสั่งบิลด์/ทดสอบ
การแก้ปัญหาการเข้าถึงแคช
หากอัตราการพบแคชไม่เป็นไปตามที่คาดไว้ ให้ทำดังนี้
ตรวจสอบว่าการเรียกใช้คำสั่งบิลด์/ทดสอบเดิมซ้ำจะทำให้เกิดการเข้าถึงแคช
เรียกใช้บิลด์และ/หรือการทดสอบที่คุณคาดว่าจะเติมแคช ครั้งแรกที่เรียกใช้บิลด์ใหม่ในสแต็กหนึ่งๆ คุณจะคาดหวังได้ว่าจะไม่มีการเข้าถึงแคชจากระยะไกล การดำเนินการจากระยะไกลจะจัดเก็บผลลัพธ์การดำเนินการไว้ในแคช และการเรียกใช้ครั้งถัดไปควรดึงผลลัพธ์เหล่านั้นขึ้นมา
วิ่ง
bazel cleanคำสั่งนี้จะล้างแคชในเครื่อง ซึ่งช่วยให้คุณตรวจสอบการพบแคชจากระยะไกลได้โดยไม่ต้องให้ผลลัพธ์ถูกซ่อนไว้ด้วยการพบแคชในเครื่องเรียกใช้บิลด์และการทดสอบที่คุณกำลังตรวจสอบอีกครั้ง (ในเครื่องเดิม)
ตรวจสอบบรรทัด
INFOสำหรับอัตราการพบแคช หากไม่เห็นกระบวนการใดๆ นอกเหนือจากremote cache hitและinternalแสดงว่าระบบกำลังเติมและเข้าถึงแคชอย่างถูกต้อง ในกรณีดังกล่าว ให้ข้ามไปยังส่วนถัดไปสาเหตุที่อาจทำให้เกิดความคลาดเคลื่อนคือสิ่งที่ไม่เป็นไปตามหลักการแยกส่วนประกอบในบิลด์ ซึ่งทำให้การดำเนินการได้รับคีย์การดำเนินการที่แตกต่างกันในการเรียกใช้ทั้ง 2 ครั้ง หากต้องการค้นหาการดำเนินการเหล่านั้น ให้ทำดังนี้
ก. เรียกใช้บิลด์หรือการทดสอบที่เป็นปัญหาอีกครั้งเพื่อรับบันทึกการดำเนินการ
bazel cleanbazel --optional-flags build //your:target --execution_log_compact_file=/tmp/exec1.logข. เปรียบเทียบบันทึกการดำเนินการระหว่างการเรียกใช้ทั้ง 2 ครั้ง ตรวจสอบว่าการดำเนินการเหมือนกันในไฟล์บันทึกทั้ง 2 ไฟล์ ความคลาดเคลื่อนจะให้ข้อมูลเบื้องต้นเกี่ยวกับการเปลี่ยนแปลงที่เกิดขึ้นระหว่างการเรียกใช้ อัปเดตบิลด์เพื่อขจัดความคลาดเคลื่อนเหล่านั้น
หากคุณแก้ปัญหาการแคชได้แล้ว และตอนนี้การเรียกใช้ซ้ำทำให้เกิดการเข้าถึงแคชทั้งหมด ให้ข้ามไปยังส่วนถัดไป
หากรหัสการดำเนินการเหมือนกันแต่ไม่มีการเข้าถึงแคช แสดงว่ามีการกำหนดค่าบางอย่างที่ป้องกันการแคช ทำตามส่วนนี้เพื่อตรวจสอบปัญหาที่พบบ่อย
ตรวจสอบว่าการดำเนินการทั้งหมดในบันทึกการดำเนินการมีการตั้งค่า
cacheableเป็น "จริง" หากcacheableไม่ปรากฏในบันทึกการดำเนินการสำหรับการดำเนินการหนึ่งๆ แสดงว่ากฎที่เกี่ยวข้องอาจมีแท็กno-cacheในคำจำกัดความในไฟล์BUILDดูช่องmnemonicและtarget_labelในบันทึกการดำเนินการเพื่อช่วยระบุที่มาของการดำเนินการหากการดำเนินการเหมือนกันและ
cacheableแต่ไม่มีการเข้าถึงแคช แสดงว่าบรรทัดคำสั่งอาจมี--noremote_accept_cachedซึ่งจะปิดใช้การค้นหาแคชสำหรับบิลด์หากการระบุบรรทัดคำสั่งจริงเป็นเรื่องยาก ให้ใช้บรรทัดคำสั่ง Canonical จาก Build Event Protocol ดังนี้
ก. เพิ่ม
--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
ตรวจสอบว่ามีการแคชในเครื่องต่างๆ
หลังจากที่การเข้าถึงแคชเกิดขึ้นตามที่คาดไว้ในเครื่องเดิมแล้ว ให้เรียกใช้บิลด์/การทดสอบเดิมในเครื่องอื่น หากสงสัยว่าไม่มีการแคชในเครื่องต่างๆ ให้ทำดังนี้
แก้ไขบิลด์เล็กน้อยเพื่อหลีกเลี่ยงการเข้าถึงแคชที่มีอยู่
เรียกใช้บิลด์ในเครื่องแรก
bazel cleanbazel ... build ... --execution_log_compact_file=/tmp/exec1.logเรียกใช้บิลด์ในเครื่องที่ 2 โดยตรวจสอบว่ามีการแก้ไขจากขั้นตอนที่ 1 แล้ว
bazel cleanbazel ... build ... --execution_log_compact_file=/tmp/exec2.logเปรียบเทียบบันทึกการดำเนินการสำหรับการเรียกใช้ทั้งสอง ครั้ง หากบันทึกไม่เหมือนกัน ให้ตรวจสอบการกำหนดค่าบิลด์เพื่อหาความคลาดเคลื่อน รวมถึงพร็อพเพอร์ตี้จากสภาพแวดล้อมโฮสต์ที่รั่วไหลไปยังบิลด์ใดบิลด์หนึ่ง
การเปรียบเทียบบันทึกการดำเนินการ
บันทึกการดำเนินการจะมีบันทึกการดำเนินการที่ดำเนินการระหว่างบิลด์ แต่ละบันทึกจะอธิบายทั้งอินพุต (ไม่เพียงแต่ไฟล์ แต่ยังรวมถึงอาร์กิวเมนต์บรรทัดคำสั่ง ตัวแปรสภาพแวดล้อม ฯลฯ) และเอาต์พุตของการดำเนินการ ดังนั้น การตรวจสอบบันทึกจึงสามารถเผยให้เห็นสาเหตุที่การดำเนินการถูกดำเนินการซ้ำ
คุณสร้างบันทึกการดำเนินการได้ใน 1 ใน 3 รูปแบบ ได้แก่ รูปแบบย่อ (--execution_log_compact_file), รูปแบบไบนารี (--execution_log_binary_file) หรือรูปแบบ JSON (--execution_log_json_file) เราขอแนะนำให้ใช้รูปแบบย่อ เนื่องจากจะสร้างไฟล์ที่มีขนาดเล็กลงมากและมีค่าใช้จ่ายรันไทม์น้อยมาก คำแนะนำต่อไปนี้ใช้ได้กับทุกรูปแบบ นอกจากนี้ คุณยังแปลงรูปแบบต่างๆ ได้โดยใช้เครื่องมือ //src/tools/execlog:converter
หากต้องการเปรียบเทียบบันทึกสำหรับบิลด์ 2 รายการที่ไม่ได้แชร์การเข้าถึงแคชตามที่คาดไว้ ให้ทำดังนี้
รับบันทึกการดำเนินการจากแต่ละบิลด์และจัดเก็บเป็น
/tmp/exec1.logและ/tmp/exec2.logดาวน์โหลดซอร์สโค้ด Bazel และสร้างเครื่องมือ
//src/tools/execlog:parsergit clone https://github.com/bazelbuild/bazel.git cd bazel bazel build //src/tools/execlog:parser
ใช้เครื่องมือ
//src/tools/execlog:parserเพื่อแปลงบันทึกเป็นรูปแบบข้อความที่อ่านได้ ในรูปแบบนี้ การดำเนินการในบันทึกที่ 2 จะเรียงลำดับให้ตรงกับลำดับในบันทึกแรก ซึ่งทำให้เปรียบเทียบได้ง่ายขึ้น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ใช้เครื่องมือเปรียบเทียบข้อความที่คุณชื่นชอบเพื่อเปรียบเทียบ
/tmp/exec1.log.txtและ/tmp/exec2.log.txt