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

รายงานปัญหา ดูแหล่งที่มา /3} /4} {3/4} {3/4} {3/4} {3/4} /4.

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

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

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

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

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

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

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

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

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

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

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

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

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

บันทึกการดำเนินการช่วยแก้ปัญหาและแก้ปัญหาเกี่ยวกับ Hit ของแคชระยะไกลที่หายไปเนื่องจากความแตกต่างระหว่างเครื่องและสภาพแวดล้อม หรือการดำเนินการที่ไม่กำหนดได้ หากคุณส่ง Flag --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 เป็นเครื่องมือการเปรียบเทียบสำหรับโปรเจ็กต์ Git เพื่อใช้เปรียบเทียบประสิทธิภาพของบิลด์ในกรณีต่อไปนี้

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

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

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

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