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

หน้านี้อธิบายวิธีเพิ่มประสิทธิภาพการบิลด์ของ 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 จะพิมพ์คำเตือนหากระบบทิ้งแคชการวิเคราะห์หรือรีสตาร์ทเซิร์ฟเวอร์ คุณควรหลีกเลี่ยงการดำเนินการทั้ง 2 อย่างนี้ระหว่างการใช้งานแบบวนซ้ำ

  • โปรดระวังการเปลี่ยนแฟล็ก 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)