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

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

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

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

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

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

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

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

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

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

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

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

แคชการวิเคราะห์เป็นข้อมูลที่สำคัญ คุณอาจใช้เวลาส่วนใหญ่ไปกับระยะการโหลดและการวิเคราะห์ของการเรียกใช้แบบ Cold Run (เช่น การเรียกใช้หลังจากที่เซิร์ฟเวอร์ 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)