ผู้ใช้ Bazel ทุกคนอาจเคยพบบิลด์ที่ช้าหรือช้ากว่าที่คาดไว้ การปรับปรุงประสิทธิภาพของแต่ละบิลด์มีค่าเฉพาะสําหรับเป้าหมายที่มีผลกระทบสําคัญ เช่น
เป้าหมายหลักของนักพัฒนาซอฟต์แวร์ที่ต้องทําซ้ําและ (สร้าง) อีกครั้ง
ไลบรารีที่ใช้กันทั่วไปอาศัยเป้าหมายอื่นๆ
เป้าหมายเป้าหมายจากคลาสเป้าหมาย (เช่น กฎที่กําหนดเอง) การวินิจฉัยและแก้ไขปัญหาในบิลด์เดียวอาจช่วยแก้ปัญหาในวงกว้างได้
ขั้นตอนสําคัญในการปรับปรุงประสิทธิภาพของบิลด์คือการทําความเข้าใจทรัพยากรที่ใช้ หน้านี้จะแสดงเมตริกต่างๆ ที่คุณรวบรวมได้ รายละเอียดประสิทธิภาพของบิลด์จะแสดงวิธีใช้เมตริกเหล่านี้ในการตรวจหาและแก้ไขปัญหาด้านประสิทธิภาพของบิลด์
การแยกเมตริกจากบิลด์ 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 บนเครื่องจริงทางกายภาพที่ไม่ได้เรียกใช้กระบวนการอื่นๆ เพื่อลดแหล่งที่มาของความผันแปร