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

รายงานปัญหา ดูซอร์สโค้ด รุ่น Nightly 8.1 · 8.0 · 7.5 · 7.4 · 7.3 · 7.2

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

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

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

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

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

การดึงข้อมูลเมตริกจากบิลด์ Bazel มี 2 วิธีหลักๆ ดังนี้

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 ใช้เวลาไปกับการดำเนินการต่างๆ อย่างรวดเร็ว

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

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

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

แม้ว่าโปรไฟล์การติดตาม JSON จะมีข้อมูลเส้นทางที่สำคัญ แต่บางครั้งคุณก็อาจต้องการข้อมูลเพิ่มเติมเกี่ยวกับกราฟความเกี่ยวข้องของการดำเนินการที่ดำเนินการ ตั้งแต่ Bazel 6.0 เป็นต้นไป คุณสามารถส่ง Flag --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 บนเครื่องจริงเฉพาะที่ไม่ได้ใช้งานกระบวนการอื่นๆ เพื่อลดแหล่งที่มาของความแปรปรวน