ผู้ใช้ Bazel ทุกคนคงเคยพบปัญหาการสร้างที่ช้ากว่าที่คาดไว้ การปรับปรุงประสิทธิภาพของแต่ละบิลด์มีคุณค่าเฉพาะ สำหรับเป้าหมายที่มีผลกระทบอย่างมาก เช่น
เป้าหมายหลักของนักพัฒนาซอฟต์แวร์ที่มักจะได้รับการทำซ้ำและสร้าง (ขึ้นมาใหม่) อยู่บ่อยๆ
ไลบรารีทั่วไปที่ขึ้นอยู่กับเป้าหมายอื่นอย่างกว้างขวาง
เป้าหมายตัวแทนจากคลาสของเป้าหมาย (เช่น กฎที่กําหนดเอง) การวินิจฉัยและการแก้ไขปัญหาในบิลด์เดียวอาจช่วยแก้ปัญหาในระดับที่ใหญ่ขึ้นได้
ขั้นตอนสำคัญในการปรับปรุงประสิทธิภาพของบิลด์คือต้องเข้าใจว่า ที่ใช้ทรัพยากรทั้งหมด หน้านี้จะแสดงเมตริกต่างๆ ที่รวบรวมได้ แจกแจงประสิทธิภาพของบิลด์จะแสดงให้เห็น คุณจะใช้เมตริกเหล่านี้เพื่อตรวจหาและแก้ปัญหาด้านประสิทธิภาพของบิลด์ได้อย่างไร
การดึงข้อมูลเมตริกจากบิลด์ Bazel มี 2 วิธีหลักๆ ดังนี้
Build Event Protocol (BEP)
Bazel แสดงบัฟเฟอร์โปรโตคอลที่หลากหลาย
build_event_stream.proto
ผ่านโปรโตคอลกิจกรรมการสร้าง (BEP) ซึ่ง
สามารถรวมได้โดยแบ็กเอนด์ที่คุณระบุ คุณอาจเลือกรวบรวมเมตริกด้วยวิธีต่างๆ ทั้งนี้ขึ้นอยู่กับ Use Case แต่เราจะอธิบายแนวคิดและช่องโปรโตบางรายการที่มีประโยชน์โดยทั่วไป
คำสั่งของ Bazel / cquery / aquery
Bazel มีโหมดการค้นหา 3 โหมด (คำค้นหา, cquery และ aquery) ที่อนุญาตให้ผู้ใช้ เพื่อค้นหากราฟเป้าหมาย กราฟเป้าหมายที่กำหนดค่าไว้ และกราฟการดำเนินการ ตามลำดับ ภาษาที่ใช้ค้นหาจะให้ ชุดฟังก์ชันที่ใช้ได้ในฟังก์ชัน โหมดการค้นหาที่ช่วยให้คุณปรับแต่งคำสืบค้นตามความต้องการได้
โปรไฟล์การติดตาม JSON
สำหรับการเรียกใช้ Bazel ที่เหมือนบิลด์ทุกครั้ง Bazel จะเขียนโปรไฟล์การติดตามใน JSON โปรไฟล์การติดตาม JSON มีประโยชน์อย่างยิ่งในการทำความเข้าใจสิ่งที่ Bazel ใช้เวลาไปกับการดำเนินการต่างๆ อย่างรวดเร็ว
บันทึกการดำเนินการ
บันทึกการดำเนินการช่วยคุณแก้ปัญหา
ไม่พบแคชระยะไกลเนื่องจากความแตกต่างระหว่างเครื่องและสภาพแวดล้อม หรือ
การดำเนินการที่ไม่กำหนดแน่ชัด หากคุณส่ง 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 เวอร์ชันเดี่ยว ใช้เพื่อตรวจหาการถดถอยในบิลด์ (มักเกิดจากการเพิ่มการพึ่งพา)
การเปรียบเทียบประสิทธิภาพของ Bazel: การเปรียบเทียบประสิทธิภาพของ Bazel 2 เวอร์ชันกันเมื่อทำการคอมมิต Git ครั้งเดียว ใช้เพื่อตรวจหาการถดถอยภายใน Bazel เอง (หากคุณเป็นผู้ดูแล/แยก Bazel ออกมา)
การเปรียบเทียบประสิทธิภาพจะตรวจสอบเวลาจริง เวลา CPU และเวลาของระบบ รวมถึงขนาดกองข้อมูลที่เก็บไว้ของ Bazel
ขอแนะนำให้เรียกใช้ม้านั่ง Bazel บนเครื่องเฉพาะที่ ไม่ใช้กระบวนการอื่นๆ เพื่อลดแหล่งที่มาของความแปรปรวน