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

วันที่ รายงานปัญหา ดูแหล่งที่มา ตอนกลางคืน · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

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

  2. ไลบรารีทั่วไปที่ขึ้นอยู่กับเป้าหมายอื่นอย่างกว้างขวาง

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

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

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

โปรโตคอลเหตุการณ์บิลด์ (BEP)

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

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

Bazel มีโหมดการค้นหา 3 โหมด (คำค้นหา, 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 เพื่อเขียนบันทึกเกี่ยวกับ การดำเนินการและการพึ่งพาระหว่างกัน

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

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

การเปรียบเทียบกับม้านั่งกับม้านั่ง

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

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

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

การเปรียบเทียบเวลาหน้าจอ เวลา CPU และเวลาของระบบ และการรักษาของ Bazel ขนาดฮีป

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