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

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

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

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

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

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

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

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

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

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

เรียกใช้ Bazel ซ้ำๆ

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

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

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

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

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

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

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

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

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

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

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