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