หน้านี้อธิบายวิธีตรวจสอบอัตราการเข้าชมแคชและวิธีตรวจสอบ แคชที่ไม่พบในบริบทของการดำเนินการจากระยะไกล
หน้านี้ถือว่าคุณมีบิลด์และ/หรือการทดสอบที่ใช้การดำเนินการจากระยะไกลได้สำเร็จ และคุณต้องการตรวจสอบว่าคุณใช้แคชระยะไกลอย่างมีประสิทธิภาพ
การตรวจสอบอัตราการเข้าชมแคช
ในเอาต์พุตมาตรฐานของการเรียกใช้ 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ซึ่งจะปิดใช้การค้นหาแคชสำหรับการสร้างหากไม่แน่ใจว่าบรรทัดคำสั่งที่ถูกต้องคืออะไร ให้ใช้บรรทัดคำสั่งที่ถูกต้องจากโปรโตคอลเหตุการณ์บิลด์ ดังนี้
ก. เพิ่ม
--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เปรียบเทียบบันทึกการดำเนินการของการเรียกใช้ 2 รายการ หากบันทึกไม่เหมือนกัน ให้ตรวจสอบการกำหนดค่าบิลด์ เพื่อหาความคลาดเคลื่อน รวมถึงพร็อพเพอร์ตี้จากสภาพแวดล้อมโฮสต์ที่รั่วไหล ไปยังบิลด์ใดบิลด์หนึ่ง
เปรียบเทียบบันทึกการดำเนินการ
บันทึกการดำเนินการมีบันทึกการดำเนินการที่ดำเนินการในระหว่างการสร้าง แต่ละบันทึกจะอธิบายทั้งอินพุต (ไม่เพียงแต่ไฟล์ แต่ยังรวมถึงอาร์กิวเมนต์บรรทัดคำสั่ง ตัวแปรสภาพแวดล้อม ฯลฯ) และเอาต์พุตของการดำเนินการ ดังนั้น การตรวจสอบบันทึกจึงสามารถแสดงให้เห็นว่าเหตุใดจึงมีการดำเนินการซ้ำ
คุณสร้างบันทึกการดำเนินการได้ใน 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:parserเครื่องมือ:git 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