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

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