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

รายงานปัญหา ดูแหล่งที่มา Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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

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

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

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

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

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

Build Event Protocol (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 เวอร์ชันเดียว ใช้เพื่อตรวจหาการถดถอยในการสร้าง (มักจะผ่าน การเพิ่มการอ้างอิง)

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

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

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