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

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

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

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

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

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

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