เพิ่มประสิทธิภาพหน่วยความจำ

รายงานปัญหา ดูแหล่งที่มา ตอนกลางคืน · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

หน้านี้จะอธิบายวิธีจำกัดและลดการใช้หน่วยความจำของ 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 มาพร้อมกับเครื่องมือสร้างโปรไฟล์หน่วยความจำในตัว ที่ช่วยให้คุณตรวจสอบ ที่ใช้หน่วยความจำได้ อ่านเพิ่มเติมเกี่ยวกับกระบวนการนี้ใน ส่วนการทำโปรไฟล์หน่วยความจำของ เอกสารเกี่ยวกับวิธีปรับปรุงประสิทธิภาพของกฎที่กำหนดเอง