ผู้ใช้ 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 ในเครื่องจริงเฉพาะที่ไม่ได้เรียกใช้กระบวนการอื่นๆ เพื่อลดแหล่งที่มาของความแปรปรวน