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

รายงานปัญหา ดูแหล่งที่มา

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

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

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

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

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

การแยกเมตริกจากบิลด์ Bazel ทําได้ 3 วิธีดังนี้

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

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

คําสั่ง / cquery / aquery ของ Bazel

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

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

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

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

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

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

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

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

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

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

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

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

  • การเปรียบเทียบ Bazl: การเปรียบเทียบ Bazel 2 เวอร์ชันกับเวอร์ชันหนึ่งๆ โดยใช้ Git เดียว ใช้ในการตรวจหาการถดถอยภายใน Bazel เอง (หากคุณต้องการรักษา / แยก Bazel)

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

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