หน้านี้จะอธิบายวิธีจำกัดและลดการใช้หน่วยความจำของ Bazel
ใช้งาน Bazel ซึ่งมี RAM จำกัด
ในบางสถานการณ์ คุณอาจต้องการให้ Bazel ใช้หน่วยความจำน้อยที่สุด คุณสามารถตั้งค่า
ฮีปสูงสุดผ่าน Flag การเริ่มต้น
--host_jvm_args
เช่น --host_jvm_args=-Xmx2g
แลกเปลี่ยนความเร็วของบิลด์ที่เพิ่มขึ้นสำหรับหน่วยความจำ
หากงานสร้างของคุณมีขนาดใหญ่เกินไป Bazel อาจส่งข้อความ OutOfMemoryError
(OOM) เมื่อ
โมเดลนั้นมีหน่วยความจำไม่เพียงพอ คุณสามารถทำให้ Bazel ใช้หน่วยความจำน้อยลงได้โดยมีค่าใช้จ่าย
ของบิลด์ที่เพิ่มขึ้นช้าลงโดยการส่งแฟล็กคำสั่งต่อไปนี้
--discard_analysis_cache
--nokeep_state_after_build
และ
--notrack_incremental_state
แฟล็กเหล่านี้จะลดหน่วยความจำที่ Bazel ใช้ในการสร้าง โดยมีต้นทุน ทำให้บิลด์ในอนาคตช้ากว่าบิลด์มาตรฐานที่เพิ่มขึ้น
คุณยังส่งแฟล็กใดสถานะหนึ่งเหล่านี้ทีละรายการได้ด้วย
--discard_analysis_cache
จะลดหน่วยความจำที่ใช้ในระหว่างการดำเนินการ (ไม่ใช่ การวิเคราะห์) บิลด์ที่เพิ่มขึ้นจะไม่ต้องทำการคโหลดแพ็กเกจซ้ำ แต่จะต้องทําการวิเคราะห์และการดำเนินการซ้ำ (แม้ว่าแคชการดำเนินการบนดิสก์จะป้องกันการดำเนินการซ้ำได้ส่วนใหญ่)--notrack_incremental_state
จะไม่จัดเก็บขอบภายในของ Bazel กราฟการอ้างอิง เพื่อไม่ให้ใช้งานสำหรับบิลด์ที่เพิ่มขึ้น บิลด์ถัดไปจะทิ้งข้อมูลดังกล่าว แต่ระบบจะเก็บข้อมูลไว้ใช้สำหรับการแก้ไขข้อบกพร่องภายในจนกว่าจะถึงเวลานั้น เว้นแต่จะมีการระบุ--nokeep_state_after_build
--nokeep_state_after_build
จะทิ้งข้อมูลทั้งหมดหลังจากบิลด์ ดังนั้น บิลด์ส่วนเพิ่มต้องสร้างใหม่ตั้งแต่ต้น (ยกเว้นการดําเนินการบนดิสก์ แคช) เพียงอย่างเดียว จะไม่ส่งผลกับส่วนที่เป็นน้ำสูงของบิลด์ปัจจุบัน
ความยืดหยุ่นในการสร้างเทรดสำหรับหน่วยความจำด้วย SkyFocus (ทดลอง)
หากคุณต้องการให้ Bazel ใช้หน่วยความจำน้อยลงและรักษาความเร็วของบิลด์ที่เพิ่มขึ้น คุณสามารถบอก Bazel เกี่ยวกับชุดไฟล์ที่ใช้งานได้ที่คุณจะแก้ไข และ Bazel จะเก็บสถานะที่จำเป็นไว้ เพื่อสร้างการเปลี่ยนแปลงทีละส่วนอย่างถูกต้อง ไฟล์เหล่านี้ ฟีเจอร์นี้เรียกว่า SkyFocus
หากต้องการใช้ SkyFocus ให้ส่งค่าสถานะ --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 มาพร้อมกับเครื่องมือสร้างโปรไฟล์หน่วยความจำในตัว ที่ช่วยให้คุณตรวจสอบ ที่ใช้หน่วยความจำได้ อ่านเพิ่มเติมเกี่ยวกับกระบวนการนี้ใน ส่วนการทำโปรไฟล์หน่วยความจำของ เอกสารเกี่ยวกับวิธีปรับปรุงประสิทธิภาพของกฎที่กำหนดเอง