การแยกเมตริกประสิทธิภาพของบิลด์

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

  1. เป้าหมายของนักพัฒนาซอฟต์แวร์หลักที่ทำซ้ำและ (สร้าง) บ่อยๆ

  2. ไลบรารีทั่วไปที่เป้าหมายอื่นๆ ใช้กันอย่างแพร่หลาย

  3. เป้าหมายที่เป็นตัวแทนจากคลาสของเป้าหมาย (เช่น กฎที่กำหนดเอง) การวินิจฉัยและแก้ไขปัญหาในบิลด์หนึ่งอาจช่วยแก้ปัญหาในวงกว้างได้

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

การแยกเมตริกออกจากบิลด์ Bazel ทำได้หลายวิธีหลักๆ ดังนี้

Build Event Protocol (BEP)

Bazel จะแสดงบัฟเฟอร์โปรโตคอลที่หลากหลาย build_event_stream.proto ผ่านBuild Event Protocol (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 ในเครื่องจริงเฉพาะที่ไม่ได้เรียกใช้กระบวนการอื่นๆ เพื่อลดแหล่งที่มาของความแปรปรวน