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

รายงานปัญหา ดูซอร์สโค้ด รุ่น Nightly · 8.0 7.4 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

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

การเรียกใช้ Bazel ประกอบด้วยหลายส่วนที่ทำงานร่วมกัน

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

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

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

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

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

การเรียกใช้ Bazel แบบซ้ำ

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

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

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

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

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

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

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

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

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

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

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

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