หน้านี้อธิบายวิธีเพิ่มประสิทธิภาพการสร้างของ Bazel เมื่อเรียกใช้ Bazel ซ้ำๆ
สถานะรันไทม์ของ Bazel
การเรียกใช้ Bazel เกี่ยวข้องกับหลายส่วนที่ทำงานร่วมกัน
อินเทอร์เฟซบรรทัดคำสั่ง (CLI) ของ
bazelเป็นเครื่องมือส่วนหน้าสำหรับผู้ใช้และรับคำสั่งจากผู้ใช้เครื่องมือ CLI จะเริ่มต้น เซิร์ฟเวอร์ Bazel สำหรับ ฐานเอาต์พุตที่แตกต่างกันแต่ละฐาน โดยทั่วไปแล้วเซิร์ฟเวอร์ Bazel จะทำงานอย่างต่อเนื่อง แต่จะปิดตัวลงหลังจากไม่มีการใช้งานเป็นระยะเวลาหนึ่งเพื่อไม่ให้สิ้นเปลืองทรัพยากร
เซิร์ฟเวอร์ Bazel จะดำเนินการขั้นตอนการโหลดและการวิเคราะห์สำหรับคำสั่งที่กำหนด (
build,run,cqueryฯลฯ) ซึ่งจะสร้างส่วนที่จำเป็นของกราฟการสร้างในหน่วยความจำ ระบบจะเก็บโครงสร้างข้อมูลที่ได้ไว้ในเซิร์ฟเวอร์ Bazel ซึ่งเป็นส่วนหนึ่งของ แคชการวิเคราะห์เซิร์ฟเวอร์ Bazel ยังสามารถดำเนินการการดำเนินการได้ด้วย หรือจะส่ง การดำเนินการเพื่อดำเนินการจากระยะไกลหากมีการตั้งค่าไว้เช่นนั้นก็ได้ ระบบจะแคชผลลัพธ์ของ การดำเนินการด้วยเช่นกัน ซึ่งจะอยู่ใน แคชการดำเนินการ (หรือ แคชการดำเนินการ ซึ่งอาจเป็นแคชในเครื่องหรือแคชระยะไกล และอาจแชร์ ระหว่างเซิร์ฟเวอร์ Bazel ได้)
ผลลัพธ์ของการเรียกใช้ Bazel จะพร้อมใช้งานในแผนผังเอาต์พุต
การเรียกใช้ Bazel ซ้ำๆ
ในเวิร์กโฟลว์ของนักพัฒนาซอฟต์แวร์โดยทั่วไปแล้ว การสร้าง (หรือเรียกใช้) โค้ดซ้ำๆ มักเกิดขึ้นบ่อยมาก (เช่น เพื่อแก้ไขข้อผิดพลาดในการคอมไพล์หรือตรวจสอบการทดสอบที่ไม่ผ่าน) ในสถานการณ์นี้ การเรียกใช้ bazel ซ้ำๆ ควรมีค่าใช้จ่ายในการดำเนินการน้อยที่สุดเท่าที่จะเป็นไปได้เมื่อเทียบกับการดำเนินการพื้นฐานที่ทำซ้ำๆ (เช่น การเรียกใช้คอมไพเลอร์หรือการดำเนินการทดสอบ)
เมื่อพิจารณาถึงเรื่องนี้แล้ว เราจะมาดูสถานะรันไทม์ของ Bazel อีกครั้ง
แคชการวิเคราะห์เป็นข้อมูลที่สำคัญ การเรียกใช้แบบเย็น (เช่น การเรียกใช้หลังจากที่เซิร์ฟเวอร์ Bazel เริ่มทำงานหรือเมื่อทิ้งแคชการวิเคราะห์) อาจใช้เวลามากในการโหลดและวิเคราะห์ การสร้างแบบเย็นที่สำเร็จเพียงครั้งเดียว (เช่น สำหรับรุ่นใช้งานจริง) อาจมีค่าใช้จ่ายที่ยอมรับได้ แต่สำหรับการสร้างเป้าหมายเดียวกันซ้ำๆ ค่าใช้จ่ายนี้ควรได้รับการชดเชยและไม่เกิดขึ้นซ้ำในการเรียกใช้แต่ละครั้ง
แคชการวิเคราะห์ค่อนข้างผันผวน ประการแรก แคชการวิเคราะห์เป็นส่วนหนึ่งของสถานะในกระบวนการของเซิร์ฟเวอร์ Bazel ดังนั้นการสูญเสียเซิร์ฟเวอร์จึงทำให้แคชหายไปด้วย นอกจากนี้ แคชยัง ล้าง ได้ง่ายมากด้วย เช่น แฟล็กบรรทัดคำสั่ง bazel หลายรายการทำให้ระบบทิ้งแคช เนื่องจากแฟล็กหลายรายการส่งผลต่อกราฟการสร้าง (เช่น เนื่องจาก
แอตทริบิวต์ที่กำหนดค่าได้) การเปลี่ยนแปลงแฟล็ก
บางรายการอาจทำให้เซิร์ฟเวอร์ Bazel รีสตาร์ทด้วย (เช่น การเปลี่ยน
ตัวเลือกการเริ่มต้น)
แคชการดำเนินการที่ดีมีประโยชน์ต่อประสิทธิภาพการสร้างด้วย คุณสามารถเก็บแคชการดำเนินการ ไว้ในเครื่อง บนดิสก์หรือ จากระยะไกลก็ได้ แคชสามารถแชร์ระหว่างเซิร์ฟเวอร์ Bazel และระหว่างนักพัฒนาซอฟต์แวร์ได้
หลีกเลี่ยงการทิ้งแคชการวิเคราะห์
Bazel จะพิมพ์คำเตือนหากระบบทิ้งแคชการวิเคราะห์หรือรีสตาร์ทเซิร์ฟเวอร์ คุณควรหลีกเลี่ยงการดำเนินการต่อไปนี้ระหว่างการใช้งานซ้ำๆ
โปรดระวังการเปลี่ยนแฟล็ก
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)