หน้านี้จะอธิบายวิธีจำกัดและลดหน่วยความจำที่ Bazel ใช้
การใช้ Bazel ที่มี RAM จํากัด
ในบางสถานการณ์ คุณอาจต้องการให้ Bazel ใช้หน่วยความจําน้อยที่สุด คุณสามารถตั้งค่ากองขยะสูงสุดผ่าน Flag เริ่มต้น --host_jvm_args
เช่น --host_jvm_args=-Xmx2g
แลกเปลี่ยนความเร็วในการสร้างที่เพิ่มขึ้นกับหน่วยความจำ
หากบิลด์มีขนาดใหญ่เกินไป Bazel อาจแสดงข้อผิดพลาด OutOfMemoryError
(OOM) เมื่อหน่วยความจำไม่เพียงพอ คุณสามารถทําให้ Bazel ใช้หน่วยความจําน้อยลงได้ แต่การบิลด์แบบเพิ่มทีละน้อยจะช้าลง โดยส่ง Flag คำสั่งต่อไปนี้
--discard_analysis_cache
,
--nokeep_state_after_build
,
และ
--notrack_incremental_state
Flag เหล่านี้จะลดหน่วยความจำที่ Bazel ใช้ในการสร้าง แต่จะทำให้การสร้างในอนาคตช้ากว่าการสร้างแบบเพิ่มมาตรฐาน
นอกจากนี้ คุณยังส่ง Flag รายการใดรายการหนึ่งเหล่านี้แยกกันได้
--discard_analysis_cache
จะลดหน่วยความจําที่ใช้ระหว่างการดําเนินการ (ไม่ใช่การวิเคราะห์) บิลด์ที่เพิ่มขึ้นจะไม่ต้องทำการคโหลดแพ็กเกจซ้ำ แต่จะต้องทําการวิเคราะห์และการดำเนินการซ้ำ (แม้ว่าแคชการดำเนินการบนดิสก์จะป้องกันการดำเนินการซ้ำได้ส่วนใหญ่)--notrack_incremental_state
จะไม่จัดเก็บขอบใดๆ ในกราฟความเกี่ยวข้องภายในของ Bazel เพื่อไม่ให้ใช้กับการสร้างแบบเพิ่มได้ บิลด์ถัดไปจะทิ้งข้อมูลดังกล่าว แต่ระบบจะเก็บข้อมูลไว้ใช้สำหรับการแก้ไขข้อบกพร่องภายในจนกว่าจะถึงเวลานั้น เว้นแต่จะมีการระบุ--nokeep_state_after_build
--nokeep_state_after_build
จะทิ้งข้อมูลทั้งหมดหลังจากการบิลด์ ดังนั้นบิลด์ที่เพิ่มขึ้นจึงต้องสร้างใหม่ตั้งแต่ต้น (ยกเว้นแคชการดำเนินการบนดิสก์) การดำเนินการนี้เพียงอย่างเดียวจะไม่ส่งผลต่อจุดสูงสุดของบิลด์ปัจจุบัน
แลกเปลี่ยนความยืดหยุ่นในการสร้างเพื่อหน่วยความจําด้วย Skyfocus (เวอร์ชันทดลอง)
หากต้องการให้ Bazel ใช้หน่วยความจําน้อยลง และคงความเร็วการสร้างที่เพิ่มขึ้นไว้ คุณสามารถบอก Bazel เกี่ยวกับชุดไฟล์ที่ทํางานซึ่งคุณจะแก้ไขได้ และ Bazel จะเก็บสถานะที่จําเป็นต่อการสร้างการเปลี่ยนแปลงไฟล์เหล่านั้นซ้ำๆ อย่างถูกต้องเท่านั้น ฟีเจอร์นี้เรียกว่า Skyfocus
หากต้องการใช้ Skyfocus ให้ส่ง Flag --experimental_enable_skyfocus
ดังนี้
bazel build //pkg:target --experimental_enable_skyfocus
โดยค่าเริ่มต้น ชุดที่ทำงานจะเป็นชุดไฟล์ข้างเป้าหมายที่กำลังสร้าง ในตัวอย่างนี้ ไฟล์ทั้งหมดใน //pkg
จะเก็บไว้ในชุดทํางาน และระบบจะไม่อนุญาตให้เปลี่ยนแปลงไฟล์นอกชุดทํางานจนกว่าคุณจะออกคำสั่ง bazel clean
หรือรีสตาร์ทเซิร์ฟเวอร์ Bazel
หากต้องการระบุชุดไฟล์หรือไดเรกทอรีที่ตรงกันทั้งหมด ให้ใช้แฟล็ก --experimental_working_set
ดังนี้
bazel build //pkg:target --experimental_enable_skyfocus
--experimental_working_set=path/to/another/dir,path/to/tests/dir
นอกจากนี้ คุณยังส่ง --experimental_skyfocus_dump_post_gc_stats
เพื่อแสดงจํานวนหน่วยความจําที่ลดลงได้ด้วย
เมื่อรวมทั้งหมดเข้าด้วยกัน คุณควรเห็นภาพประมาณนี้
$ bazel test //pkg:target //tests/... --experimental_enable_skyfocus --experimental_working_set dir1,dir2,dir3/subdir --experimental_skyfocus_dump_post_gc_stats
INFO: --experimental_enable_skyfocus is enabled. Blaze will reclaim memory not needed to build the working set. Run 'blaze dump --skyframe=working_set' to show the working set, after this command.
WARNING: Changes outside of the working set will cause a build error.
INFO: Analyzed 149 targets (4533 packages loaded, 169438 targets configured).
INFO: Found 25 targets and 124 test targets...
INFO: Updated working set successfully.
INFO: Focusing on 334 roots, 3 leafs... (use --experimental_skyfocus_dump_keys to show them)
INFO: Heap: 1237MB -> 676MB (-45.31%)
INFO: Elapsed time: 192.670s ...
INFO: Build completed successfully, 62303 total actions
ในตัวอย่างนี้ การใช้ Skyfocus ช่วยให้ Bazel ใช้หน่วยความจำได้น้อยลง 561 MB (45%) และบิลด์แบบเพิ่มเพื่อจัดการการเปลี่ยนแปลงไฟล์ใน dir1
, dir2
และ dir3/subdir
จะยังคงทำงานได้อย่างรวดเร็ว แต่ข้อเสียคือ Bazel จะสร้างไฟล์ที่เปลี่ยนแปลงใหม่นอกไดเรกทอรีเหล่านี้ไม่ได้
การสร้างโปรไฟล์หน่วยความจํา
Bazel มาพร้อมกับเครื่องมือวิเคราะห์หน่วยความจำในตัวซึ่งช่วยตรวจสอบการใช้หน่วยความจำของกฎได้ อ่านเพิ่มเติมเกี่ยวกับกระบวนการนี้ในส่วนการโปรไฟล์หน่วยความจําของเอกสารประกอบเกี่ยวกับวิธีปรับปรุงประสิทธิภาพของกฎที่กําหนดเอง