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

รายงานปัญหา ดูแหล่งที่มา Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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