ผู้ใช้ Bazel เกือบทุกคนน่าจะเคยพบกับบิลด์ที่ช้าหรือช้ากว่าที่คาดไว้ การปรับปรุงประสิทธิภาพของบิลด์แต่ละรายการมีคุณค่าอย่างยิ่งสำหรับเป้าหมายที่มีผลกระทบอย่างมาก เช่น
เป้าหมายของนักพัฒนาหลักที่ทำซ้ำและ (สร้าง) บ่อยๆ
ไลบรารีทั่วไปที่เป้าหมายอื่นๆ ใช้กันอย่างแพร่หลาย
เป้าหมายที่เป็นตัวแทนจากคลาสของเป้าหมาย (เช่น กฎที่กำหนดเอง) การวินิจฉัยและแก้ไขปัญหาในบิลด์หนึ่งอาจช่วยแก้ปัญหาในวงกว้างได้
ขั้นตอนสำคัญในการปรับปรุงประสิทธิภาพของบิลด์คือการทำความเข้าใจว่ามีการใช้ทรัพยากรไปกับอะไรบ้าง หน้านี้แสดงรายการเมตริกต่างๆ ที่คุณรวบรวมได้ การแยกย่อยประสิทธิภาพของบิลด์ จะแสดงให้เห็น วิธีใช้เมตริกเหล่านี้เพื่อตรวจหาและแก้ไขปัญหาด้านประสิทธิภาพของบิลด์
การแยกเมตริกออกจากบิลด์ Bazel ทำได้หลายวิธีหลักๆ ดังนี้
โปรโตคอลเหตุการณ์บิลด์ (BEP)
Bazel จะแสดงผลบัฟเฟอร์โปรโตคอลที่หลากหลาย
build_event_stream.proto
ผ่านโปรโตคอลเหตุการณ์บิลด์ (BEP) ซึ่งแบ็กเอนด์ที่คุณระบุสามารถรวบรวมได้
คุณอาจตัดสินใจรวบรวมเมตริกด้วยวิธีต่างๆ ขึ้นอยู่กับ Use Case แต่ในที่นี้เราจะพูดถึงแนวคิดและช่องโปรโตบางอย่างที่โดยทั่วไปแล้วควรพิจารณา
คำสั่ง query / cquery / aquery ของ Bazel
Bazel มีโหมดการค้นหา 3 โหมด (query, cquery และ aquery) ที่ช่วยให้ผู้ใช้ค้นหากราฟเป้าหมาย กราฟเป้าหมายที่กำหนดค่า และกราฟการดำเนินการตามลำดับ ภาษาการค้นหา มีชุดฟังก์ชันที่ใช้ได้ ในโหมดการค้นหาต่างๆ ซึ่งช่วยให้คุณปรับแต่งการค้นหา ได้ตามความต้องการ
โปรไฟล์การติดตาม JSON
สำหรับการเรียกใช้ Bazel ทุกครั้งที่คล้ายกับการสร้าง Bazel จะเขียนโปรไฟล์การติดตามในรูปแบบ JSON โปรไฟล์การติดตาม JSONมีประโยชน์มาก ในการทำความเข้าใจอย่างรวดเร็วว่า Bazel ใช้เวลาไปกับอะไรบ้างระหว่างการเรียกใช้
บันทึกการดำเนินการ
บันทึกการดำเนินการช่วยคุณแก้ปัญหาและแก้ไขการแคชระยะไกลที่ไม่พบเนื่องจากความแตกต่างของเครื่องและสภาพแวดล้อมหรือการดำเนินการที่ไม่แน่นอน หากคุณส่งแฟล็ก
--experimental_execution_log_spawn_metrics
(พร้อมใช้งานตั้งแต่ Bazel 5.2) แฟล็กนี้จะมีเมตริกการแยกย่อยโดยละเอียดสำหรับการดำเนินการที่ดำเนินการ
ในเครื่องและระยะไกล คุณสามารถใช้เมตริกเหล่านี้ เช่น เพื่อเปรียบเทียบประสิทธิภาพของเครื่องในเครื่องกับเครื่องระยะไกล หรือเพื่อดูว่าส่วนใดของการดำเนินการแยกย่อยช้ากว่าที่คาดไว้ (เช่น เนื่องจากการจัดคิว)
บันทึกกราฟการดำเนินการ
แม้ว่าโปรไฟล์การติดตาม JSON จะมีข้อมูลเส้นทางวิกฤต แต่บางครั้งคุณก็ต้องการข้อมูลเพิ่มเติมเกี่ยวกับกราฟทรัพยากร Dependency ของการดำเนินการที่ดำเนินการ
ตั้งแต่ Bazel 6.0 เป็นต้นไป คุณสามารถส่งแฟล็ก
--experimental_execution_graph_log และ
--experimental_execution_graph_log_dep_type=all เพื่อเขียนบันทึกเกี่ยวกับการดำเนินการที่ดำเนินการและการพึ่งพาอาศัยกัน
คุณสามารถใช้ข้อมูลนี้เพื่อทำความเข้าใจการหน่วงเวลาที่โหนดเพิ่มลงในเส้นทางวิกฤต การหน่วงเวลาคือระยะเวลาที่อาจประหยัดได้โดยการนำโหนดหนึ่งๆ ออกจากกราฟการดำเนินการ
ข้อมูลนี้ช่วยให้คุณคาดการณ์ผลกระทบของการเปลี่ยนแปลงกราฟบิลด์และการดำเนินการก่อนที่จะดำเนินการจริง
การเปรียบเทียบประสิทธิภาพด้วย bazel-bench
Bazel bench เป็นเครื่องมือเปรียบเทียบประสิทธิภาพ สำหรับโปรเจ็กต์ Git เพื่อเปรียบเทียบประสิทธิภาพของบิลด์ในกรณีต่อไปนี้
การเปรียบเทียบประสิทธิภาพของโปรเจ็กต์: การเปรียบเทียบ Git 2 รายการกับ Bazel เวอร์ชันเดียว ใช้เพื่อตรวจหาการถดถอยในบิลด์ (มักจะผ่านการเพิ่มการพึ่งพา)
การเปรียบเทียบประสิทธิภาพของ Bazel: การเปรียบเทียบ Bazel 2 เวอร์ชันกับ Git รายการเดียว ใช้เพื่อตรวจหาการเกิดปัญหาซ้ำภายใน Bazel เอง (หากคุณดูแล / ฟอร์ก Bazel)
การเปรียบเทียบประสิทธิภาพจะตรวจสอบเวลาจริง เวลา CPU และเวลาของระบบ รวมถึงขนาดฮีปที่ Bazel เก็บไว้
นอกจากนี้ เราขอแนะนำให้เรียกใช้ Bazel bench ในเครื่องจริงที่เฉพาะเจาะจงซึ่งไม่ได้เรียกใช้กระบวนการอื่นๆ เพื่อลดแหล่งที่มาของความแปรปรวน