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

รายงานปัญหา ดูแหล่งที่มา Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

หน้านี้อธิบายวิธีจำกัดและลดหน่วยความจำที่ Bazel ใช้

การเรียกใช้ Bazel ด้วย RAM ที่จำกัด

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