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

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

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

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

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

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

การดึงข้อมูลเมตริกจากการสร้าง Bazel ทำได้หลายวิธีหลักๆ ดังนี้

โปรโตคอลเหตุการณ์ของ Build (BEP)

Bazel จะแสดง Protocol Buffer หลายรายการ build_event_stream.proto ผ่านBuild Event Protocol (BEP) ซึ่ง แบ็กเอนด์ที่คุณระบุจะรวบรวมได้ คุณอาจเลือกที่จะรวบรวมเมตริกในรูปแบบต่างๆ ตาม Use Case ของคุณ แต่ในที่นี้เราจะพูดถึงแนวคิดและฟิลด์ Proto บางอย่างที่โดยทั่วไปแล้วควรนำมาพิจารณา

คำสั่ง query / cquery / aquery ของ Bazel

Bazel มีโหมดการค้นหาที่แตกต่างกัน 3 โหมด (query, cquery และ aquery) ซึ่งช่วยให้ผู้ใช้ค้นหากราฟเป้าหมาย กราฟเป้าหมายที่กำหนดค่า และกราฟการดำเนินการได้ตามลำดับ ภาษาการค้นหาจะมาพร้อมชุดฟังก์ชันที่ใช้ได้ในโหมดการค้นหาต่างๆ ซึ่งช่วยให้คุณปรับแต่งการค้นหาได้ตามต้องการ

โปรไฟล์การติดตาม JSON

สำหรับการเรียกใช้ Bazel ทุกครั้งที่คล้ายกับการสร้าง Bazel จะเขียนโปรไฟล์การติดตามในรูปแบบ JSON โปรไฟล์การติดตาม JSON มีประโยชน์อย่างมากในการทำความเข้าใจอย่างรวดเร็วว่า Bazel ใช้เวลาไปกับอะไรบ้างในระหว่างการเรียกใช้

บันทึกการดำเนินการ

บันทึกการดำเนินการจะช่วยคุณแก้ปัญหาและแก้ไขการเข้าชมแคชระยะไกลที่ขาดหายไปเนื่องจากความแตกต่างของเครื่องและสภาพแวดล้อม หรือการดำเนินการที่ไม่แน่นอน หากส่งแฟล็ก --experimental_execution_log_spawn_metrics (พร้อมใช้งานจาก Bazel 5.2) แฟล็กจะยังมีเมตริกการเกิดโดยละเอียดสําหรับการดําเนินการที่ ดําเนินการในเครื่องและจากระยะไกลด้วย คุณสามารถใช้เมตริกเหล่านี้เพื่อเปรียบเทียบประสิทธิภาพของเครื่องในพื้นที่กับเครื่องระยะไกล หรือเพื่อดูว่าส่วนใดของการเรียกใช้สปอนช้ากว่าที่คาดไว้ (เช่น เนื่องจากมีการจัดคิว)

บันทึกกราฟการดำเนินการ

แม้ว่าโปรไฟล์การติดตาม JSON จะมีข้อมูลเส้นทางวิกฤต แต่บางครั้งคุณก็ต้องใช้ข้อมูลเพิ่มเติมเกี่ยวกับกราฟการอ้างอิงของการดำเนินการที่เรียกใช้ ตั้งแต่ Bazel 6.0 เป็นต้นไป คุณสามารถส่งแฟล็ก --experimental_execution_graph_log และ --experimental_execution_graph_log_dep_type=all เพื่อเขียนบันทึกเกี่ยวกับการ ดำเนินการที่เรียกใช้และความสัมพันธ์ระหว่างกัน

ข้อมูลนี้สามารถใช้เพื่อทำความเข้าใจการหน่วงเวลาที่โหนดเพิ่มใน เส้นทางวิกฤต การลากคือระยะเวลาที่อาจประหยัดได้ โดยการนำโหนดที่เฉพาะเจาะจงออกจากกราฟการดำเนินการ

ข้อมูลนี้ช่วยให้คุณคาดการณ์ผลกระทบของการเปลี่ยนแปลงกราฟการสร้างและการดำเนินการ ก่อนที่จะดำเนินการจริง

การเปรียบเทียบด้วย bazel-bench

Bazel bench เป็น เครื่องมือเปรียบเทียบสำหรับโปรเจ็กต์ Git เพื่อเปรียบเทียบประสิทธิภาพการบิลด์ในกรณีต่อไปนี้

  • การเปรียบเทียบโปรเจ็กต์: การเปรียบเทียบ Git Commit 2 รายการกับแต่ละรายการใน Bazel เวอร์ชันเดียว ใช้เพื่อตรวจหาการเกิดปัญหาซ้ำในบิลด์ของคุณ (มักจะผ่าน การเพิ่มทรัพยากร Dependency)

  • การเปรียบเทียบ Bazel: การเปรียบเทียบ Bazel 2 เวอร์ชันกับแต่ละเวอร์ชันที่ การคอมมิต Git เดียว ใช้เพื่อตรวจหาการเกิดปัญหาซ้ำภายใน Bazel เอง (หากคุณดูแลรักษาหรือฟอร์ก Bazel)

การเปรียบเทียบจะตรวจสอบเวลาจริง เวลา CPU และเวลาของระบบ รวมถึงขนาดฮีปที่ Bazel เก็บไว้

นอกจากนี้ เราขอแนะนำให้เรียกใช้ Bazel Bench บนเครื่องจริงเฉพาะที่ไม่ได้เรียกใช้กระบวนการอื่นๆ เพื่อลดแหล่งที่มาของความแปรปรวน