เพิ่มความเร็วในการทำซ้ำ

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

หน้านี้จะอธิบายวิธีเพิ่มประสิทธิภาพบิลด์ของ Bazel เมื่อเรียกใช้ Bazel ซ้ำๆ

สถานะรันไทม์ของ Bazel

การเรียกใช้ Bazel จะมีส่วนที่มีการโต้ตอบหลายส่วน

  • อินเทอร์เฟซบรรทัดคำสั่ง (CLI) ของ bazel เป็นเครื่องมือส่วนหน้าที่แสดงต่อผู้ใช้และรับคำสั่งจากผู้ใช้

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

  • เซิร์ฟเวอร์ Bazel จะดำเนินการขั้นตอนการโหลดและการวิเคราะห์สำหรับคำสั่งที่ระบุ (build, run, cquery ฯลฯ) ซึ่งจะสร้างส่วนที่จำเป็นของกราฟบิลด์ในหน่วยความจำ โครงสร้างข้อมูลที่เป็นผลลัพธ์จะเก็บไว้ในเซิร์ฟเวอร์ Bazel โดยเป็นส่วนหนึ่งของแคชการวิเคราะห์

  • นอกจากนี้ เซิร์ฟเวอร์ Bazel ยังสามารถดำเนินการ หรือส่งการดำเนินการจากระยะไกลหากตั้งค่าไว้ ผลลัพธ์ของการดำเนินการดังกล่าวจะได้รับการแคชด้วย กล่าวคือในแคชการดำเนินการ (หรือแคชการดำเนินการ ซึ่งอาจเป็นภายในเครื่องหรือระยะไกล และอาจมีการแชร์ไว้ในเซิร์ฟเวอร์ Bazel)

  • ผลลัพธ์ของการเรียกใช้ Bazel ใช้งานได้ในโครงสร้างเอาต์พุต

วิ่ง Bazel ซ้ำซาก

ในเวิร์กโฟลว์ของนักพัฒนาซอฟต์แวร์โดยทั่วไป การสร้าง (หรือเรียกใช้) โค้ดชุดหนึ่งซ้ำๆ ซึ่งมักจะอยู่ในความถี่สูงมาก (เช่น เพื่อแก้ไขข้อผิดพลาดการคอมไพล์หรือตรวจสอบการทดสอบที่ล้มเหลว) เป็นเรื่องปกติ ในสถานการณ์นี้ การเรียกใช้ bazel ที่ซ้ำจะมีโอเวอร์เฮ็ดน้อยที่สุดเท่าที่จะเป็นไปได้เมื่อเทียบกับการดำเนินการที่เกี่ยวข้องและทำซ้ำ (เช่น การเรียกใช้คอมไพเลอร์หรือการดำเนินการทดสอบ)

ด้วยเหตุนี้ เราจึงดูที่สถานะรันไทม์ของ Bazel อีกครั้ง

แคชการวิเคราะห์คือส่วนข้อมูลที่สำคัญ เวลาจํานวนมากอาจนำไปใช้เพียงแค่ในขั้นตอนการโหลดและการวิเคราะห์ของ Cold Run (เช่น การเรียกใช้หลังจากเซิร์ฟเวอร์ Bazel เริ่มทำงานหรือเมื่อแคชการวิเคราะห์ถูกยกเลิก) ค่าใช้จ่ายสำหรับบิลด์ Cold ที่ประสบความสำเร็จรายการเดียว (เช่น สำหรับเวอร์ชันที่ใช้งานจริง) ค่าใช้จ่ายนี้สามารถทนได้ แต่สำหรับการสร้างเป้าหมายเดิมซ้ำๆ คุณต้องตัดค่าใช้จ่ายนี้และไม่ทำซ้ำในการเรียกแต่ละครั้ง

แคชการวิเคราะห์มีความผันผวน อย่างแรกคือ มันเป็นส่วนหนึ่งของสถานะในกระบวนการ ของเซิร์ฟเวอร์ Bazel ดังนั้นการสูญเสียเซิร์ฟเวอร์จะสูญเสียแคชไป แต่แคชยังใช้ไม่ได้ได้ง่ายมาก เช่น การแจ้งบรรทัดคำสั่งของ bazel จำนวนมากก็ส่งผลให้แคชถูกยกเลิก เนื่องจากมีแฟล็กจำนวนมากส่งผลต่อกราฟบิลด์ (เช่น เพราะแอตทริบิวต์ที่กำหนดค่าได้) การเปลี่ยนแปลงแฟล็กบางอย่างอาจทำให้เซิร์ฟเวอร์ Bazel รีสตาร์ทได้ (เช่น การเปลี่ยนตัวเลือกการเริ่มต้นใช้งาน)

แคชการดำเนินการที่ดีจะมีประโยชน์สำหรับประสิทธิภาพของบิลด์ด้วย ระบบอาจเก็บแคชการดำเนินการไว้ในดิสก์หรือจากระยะไกล แคชนี้สามารถแชร์ระหว่างเซิร์ฟเวอร์ Bazel และนักพัฒนาซอฟต์แวร์ได้

หลีกเลี่ยงการทิ้งแคชการวิเคราะห์

Bazel จะพิมพ์คำเตือนหากมีการทิ้งแคชการวิเคราะห์หรือมีการรีสตาร์ทเซิร์ฟเวอร์ ควรหลีกเลี่ยงคำ 2 อย่างต่อไปนี้ระหว่างการใช้งานซ้ำๆ

  • โปรดระมัดระวังการเปลี่ยน Flag bazel ในระหว่างเวิร์กโฟลว์แบบทำซ้ำ ตัวอย่างเช่น การรวม bazel build -c opt กับ bazel cquery จะทำให้แต่ละคำสั่งทิ้งแคชการวิเคราะห์ของอีกคำสั่งหนึ่ง โดยทั่วไป ให้ลองใช้ชุดแฟล็กคงที่ในช่วงเวลาของเวิร์กโฟลว์ที่เฉพาะเจาะจง

  • การสูญเสียเซิร์ฟเวอร์ Bazel จะสูญเสียแคชการวิเคราะห์ เซิร์ฟเวอร์ Bazel มีเวลาที่ไม่มีการใช้งานที่กำหนดค่าได้ หลังจากนั้นเซิร์ฟเวอร์จะปิดลง คุณสามารถกำหนดค่าเวลานี้ผ่านไฟล์ bazelrc ได้ตามต้องการ เซิร์ฟเวอร์ยังรีสตาร์ทเมื่อการตั้งค่าสถานะเริ่มต้นมีการเปลี่ยนแปลง ดังนั้น ให้หลีกเลี่ยงการเปลี่ยนแฟล็กเหล่านั้นหากเป็นไปได้

  • โปรดระวังว่าเซิร์ฟเวอร์ Bazel จะหยุดทำงานหากคุณกด Ctrl-C ซ้ำๆ ขณะที่ Bazel ทำงานอยู่ การพยายามประหยัดเวลาด้วยการขัดจังหวะบิลด์ที่กำลังทำงานซึ่งไม่จำเป็นอีกต่อไปแล้ว แต่กด Ctrl-C เพียงครั้งเดียวเพื่อขอให้สิ้นสุดคำขอปัจจุบันอย่างสวยงาม

  • หากต้องการใช้แฟล็กหลายชุดจากพื้นที่ทำงานเดียวกัน คุณสามารถใช้ฐานเอาต์พุตที่แตกต่างกันหลายฐานได้ โดยสลับกับแฟล็ก --output_base ฐานเอาต์พุตแต่ละรายการจะมีเซิร์ฟเวอร์ Bazel เป็นของตัวเอง

หากต้องการให้เงื่อนไขนี้เป็นข้อผิดพลาดแทนที่จะเป็นคำเตือน คุณใช้แฟล็ก --noallow_analysis_cache_discard (เปิดตัวใน Bazel 6.4.0) ได้