หน้านี้จะอธิบายวิธีเพิ่มประสิทธิภาพการสร้างของ 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)