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

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

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

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

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

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

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

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

  • เซิร์ฟเวอร์ Bazel ยังสามารถดำเนินการดำเนินการ หรืออาจส่งการทำงานออกสำหรับการดำเนินการจากระยะไกลหากตั้งไว้

  • ผลลัพธ์ของการเรียกใช้ Bazel จะปรากฏในแผนผังเอาต์พุต

วิ่ง Bazel ซ้ำๆ

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

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

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

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

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

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

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

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

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

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

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