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

รายงานปัญหา ดูแหล่งที่มา ตอนกลางคืน · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

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

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

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

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

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

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

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

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

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

ดังนั้น เราจึงต้องพิจารณาสถานะรันไทม์ของ Bazel อีกครั้ง

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

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

แคชการดำเนินการที่ดียังมีค่าสำหรับประสิทธิภาพของบิลด์ด้วย การดำเนินการ สามารถเก็บแคชไว้ในเครื่องได้ บนดิสก์ หรือ จากระยะไกล คุณสามารถแชร์แคชกับ เซิร์ฟเวอร์ Bazel กัน และนักพัฒนานั้นจริงๆ

หลีกเลี่ยงการทิ้งแคชการวิเคราะห์

Bazel จะพิมพ์คำเตือนหากมีการทิ้งแคชการวิเคราะห์หรือ รีสตาร์ทเซิร์ฟเวอร์แล้ว คุณควรหลีกเลี่ยงวิธีใดวิธีหนึ่งต่อไปนี้ในระหว่างการใช้งานซ้ำๆ

  • โปรดอย่าลืมเปลี่ยนแฟล็ก bazel ในช่วงกลางของการปรับเปลี่ยนซ้ำๆ เช่น การรวม bazel build -c opt กับ bazel cquery จะทำให้แต่ละคำสั่งทิ้งแคชการวิเคราะห์ของอีกคำสั่งหนึ่ง โดยทั่วไปแล้ว ให้ใช้ชุดแฟล็กคงที่ในช่วงเวลาของเวิร์กโฟลว์หนึ่งๆ

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

  • ระวังว่าเซิร์ฟเวอร์ Bazel จะถูกปิด หากคุณกด กด Ctrl-C ซ้ำๆ ขณะที่ Bazel ทำงานอยู่ คุณคงอยากพยายามประหยัดเวลา โดยการขัดจังหวะบิลด์ที่กำลังทำงานซึ่งไม่จำเป็นต้องใช้อีกต่อไป แต่ให้กดเพียงอย่างเดียว กด Ctrl-C 1 ครั้งเพื่อขอสิ้นสุดการเรียกใช้ปัจจุบันอย่างนุ่มนวล

  • หากคุณต้องการใช้แฟล็กหลายชุดจากพื้นที่ทำงานเดียวกัน คุณสามารถ ใช้ฐานเอาต์พุตที่แตกต่างกันหลายรายการ สลับกับ --output_base แจ้ง ฐานเอาต์พุตแต่ละฐานจะมีเซิร์ฟเวอร์ Bazel ของตัวเอง

หากต้องการทำให้เงื่อนไขนี้เป็นข้อผิดพลาดแทนที่จะเป็นคำเตือน คุณสามารถใช้ --noallow_analysis_cache_discard Flag (เปิดตัวใน Bazel 6.4.0)