ผู้ใช้ Bazel ทุกคนอาจเคยพบการบิลด์ที่ช้าหรือช้ากว่าที่คาดไว้ การปรับปรุงประสิทธิภาพของบิลด์แต่ละรายการมีคุณค่าเป็นพิเศษ สำหรับเป้าหมายที่มีผลกระทบอย่างมาก เช่น
เป้าหมายหลักของนักพัฒนาแอปที่ได้รับการทำซ้ำและสร้าง (ใหม่) อยู่บ่อยครั้ง
ไลบรารีทั่วไปที่เป้าหมายอื่นๆ ใช้กันอย่างแพร่หลาย
เป้าหมายที่เป็นตัวแทนจากกลุ่มเป้าหมาย (เช่น กฎที่กำหนดเอง) การวินิจฉัยและแก้ไขปัญหาในการสร้างครั้งเดียวอาจช่วยแก้ปัญหาใน ระดับที่ใหญ่ขึ้นได้
ขั้นตอนสำคัญในการปรับปรุงประสิทธิภาพของการบิลด์คือการทำความเข้าใจว่ามีการใช้ทรัพยากรที่ใด หน้านี้แสดงเมตริกต่างๆ ที่คุณรวบรวมได้ การวิเคราะห์ประสิทธิภาพการสร้างจะแสดง วิธีใช้เมตริกเหล่านี้เพื่อตรวจหาและแก้ไขปัญหาด้านประสิทธิภาพการสร้าง
การดึงข้อมูลเมตริกจากการสร้าง Bazel ทำได้หลายวิธีหลักๆ ดังนี้
Build Event Protocol (BEP)
Bazel จะแสดงผล Protocol Buffer
build_event_stream.proto
ต่างๆ ผ่านBuild Event Protocol (BEP) ซึ่ง
สามารถรวบรวมได้โดยแบ็กเอนด์ที่คุณระบุ คุณอาจเลือกที่จะรวบรวมเมตริกในรูปแบบต่างๆ ตาม Use Case ของคุณ แต่ในที่นี้เราจะพูดถึงแนวคิดและฟิลด์ Proto บางอย่างที่โดยทั่วไปแล้วควรนำมาพิจารณา
คำสั่ง query / cquery / aquery ของ Bazel
Bazel มีโหมดการค้นหาที่แตกต่างกัน 3 โหมด (query, cquery และ aquery) ซึ่งช่วยให้ผู้ใช้ค้นหากราฟเป้าหมาย กราฟเป้าหมายที่กำหนดค่า และกราฟการดำเนินการได้ตามลำดับ ภาษาการค้นหามีชุดฟังก์ชันที่ใช้ได้ในโหมดการค้นหาต่างๆ ซึ่งช่วยให้คุณปรับแต่งการค้นหาได้ตามต้องการ
โปรไฟล์การติดตาม JSON
สำหรับการเรียกใช้ Bazel ทุกครั้งที่คล้ายกับการบิลด์ Bazel จะเขียนโปรไฟล์การติดตามในรูปแบบ JSON โปรไฟล์การติดตาม JSON มีประโยชน์อย่างมากในการทำความเข้าใจอย่างรวดเร็วว่า Bazel ใช้เวลาไปกับอะไรบ้างในระหว่างการเรียกใช้
บันทึกการดำเนินการ
บันทึกการดำเนินการจะช่วยคุณแก้ปัญหาและแก้ไข
การแคชระยะไกลที่ขาดหายไปเนื่องจากความแตกต่างของเครื่องและสภาพแวดล้อม หรือ
การดำเนินการที่ไม่แน่นอน หากส่งแฟล็ก
--experimental_execution_log_spawn_metrics
(พร้อมใช้งานจาก Bazel 5.2) แฟล็กจะยังมีเมตริกการเกิดโดยละเอียดสําหรับการดําเนินการที่
ดําเนินการในเครื่องและจากระยะไกลด้วย คุณสามารถใช้เมตริกเหล่านี้เพื่อเปรียบเทียบประสิทธิภาพของเครื่องในพื้นที่กับเครื่องระยะไกล หรือเพื่อดูว่าส่วนใดของการเรียกใช้สปอนช้ากว่าที่คาดไว้ (เช่น เนื่องจากมีการจัดคิว)
บันทึกกราฟการดำเนินการ
แม้ว่าโปรไฟล์การติดตาม JSON จะมีข้อมูลเส้นทางวิกฤต แต่บางครั้งคุณก็ต้องใช้ข้อมูลเพิ่มเติมเกี่ยวกับกราฟการอ้างอิงของการดำเนินการที่ดำเนินการ
ตั้งแต่ Bazel 6.0 เป็นต้นไป คุณสามารถส่งแฟล็ก
--experimental_execution_graph_log
และ
--experimental_execution_graph_log_dep_type=all
เพื่อเขียนบันทึกเกี่ยวกับการ
ดำเนินการที่ดำเนินการแล้วและการพึ่งพาซึ่งกันและกัน
ข้อมูลนี้สามารถใช้เพื่อทำความเข้าใจการหน่วงเวลาที่โหนดเพิ่มใน เส้นทางวิกฤต การลากคือระยะเวลาที่อาจประหยัดได้ โดยการนำโหนดที่เฉพาะเจาะจงออกจากกราฟการดำเนินการ
ข้อมูลนี้ช่วยให้คุณคาดการณ์ผลกระทบของการเปลี่ยนแปลงกราฟการสร้างและการดำเนินการ ก่อนที่จะดำเนินการจริง
การเปรียบเทียบด้วย bazel-bench
Bazel bench เป็น เครื่องมือเปรียบเทียบสำหรับโปรเจ็กต์ Git เพื่อเปรียบเทียบประสิทธิภาพการบิลด์ในกรณีต่อไปนี้
การเปรียบเทียบโปรเจ็กต์: การเปรียบเทียบ Git Commit 2 รายการกับแต่ละรายการใน Bazel เวอร์ชันเดียว ใช้เพื่อตรวจหาการถดถอยในการสร้าง (มักจะผ่าน การเพิ่มการอ้างอิง)
การเปรียบเทียบ Bazel: การเปรียบเทียบ Bazel 2 เวอร์ชันกับแต่ละเวอร์ชันที่ การเปลี่ยนแปลง Git รายการเดียว ใช้เพื่อตรวจหาการถดถอยภายใน Bazel เอง (หากคุณดูแลรักษาหรือแยก Bazel ออกมา)
การเปรียบเทียบจะตรวจสอบเวลาจริง เวลา CPU และเวลาของระบบ รวมถึงขนาดฮีปที่ Bazel เก็บไว้
นอกจากนี้ เราขอแนะนำให้เรียกใช้ Bazel Bench บนเครื่องจริงเฉพาะที่ไม่ได้เรียกใช้กระบวนการอื่นๆ เพื่อลดแหล่งที่มาของความแปรปรวน