Tối ưu hoá bộ nhớ

Báo cáo vấn đề Xem nguồn Hằng đêm · 7,3 · 7,2 · 7.1 · 7 · 6,5

Trang này mô tả cách giới hạn và giảm mức bộ nhớ mà Bazel sử dụng.

Chạy Bazel với RAM hạn chế

Trong một số trường hợp, bạn có thể muốn Bazel sử dụng bộ nhớ tối thiểu. Bạn có thể đặt vùng nhớ khối xếp tối đa thông qua cờ khởi động --host_jvm_args, chẳng hạn như --host_jvm_args=-Xmx2g.

Đổi tốc độ bản dựng gia tăng để lấy bộ nhớ

Nếu công trình của bạn quá lớn, Bazel có thể gửi một OutOfMemoryError (OOM) khi nó không có đủ bộ nhớ. Bạn có thể khiến Bazel tốn ít bộ nhớ hơn của các bản dựng tăng dần chậm hơn, bằng cách truyền các cờ lệnh sau: --discard_analysis_cache! --nokeep_state_after_build, và --notrack_incremental_state.

Những cờ này sẽ giảm thiểu bộ nhớ mà Bazel sử dụng trong một bản dựng, nhưng đổi lại là làm cho các bản dựng trong tương lai chậm hơn so với bản dựng tăng dần tiêu chuẩn.

Bạn cũng có thể truyền một trong những cờ này một cách riêng lẻ:

  • --discard_analysis_cache sẽ giảm mức sử dụng bộ nhớ trong quá trình thực thi (không phải bản phân tích). Các bản dựng gia tăng sẽ không phải thực hiện lại quá trình tải gói, nhưng sẽ phải làm lại quá trình phân tích và thực thi (mặc dù bộ nhớ đệm hành động trên đĩa có thể ngăn chặn hầu hết việc thực thi lại).
  • --notrack_incremental_state sẽ không lưu trữ bất kỳ cạnh nào trong nội bộ của Bazel biểu đồ phần phụ thuộc để không sử dụng được cho các bản dựng gia tăng. Bản dựng tiếp theo sẽ loại bỏ dữ liệu đó mà vẫn được giữ nguyên cho đến thời điểm đó, để gỡ lỗi nội bộ trừ khi bạn chỉ định --nokeep_state_after_build.
  • --nokeep_state_after_build sẽ loại bỏ mọi dữ liệu sau khi tạo bản dựng để bản dựng tăng dần phải tạo từ đầu (ngoại trừ thao tác trên ổ đĩa bộ nhớ đệm). Nếu chỉ dùng một mình, vấn đề này không ảnh hưởng đến nhãn nước cao của công trình hiện tại.

Trao đổi tính linh hoạt của bản dựng cho bộ nhớ bằng Skyfocus (Thử nghiệm)

Nếu bạn muốn Bazel sử dụng ít bộ nhớ hơn duy trì tốc độ xây dựng gia tăng, bạn có thể cho Bazel biết nhóm tệp đang hoạt động mà bạn sẽ sửa đổi, và Bazel sẽ chỉ giữ lại trạng thái cần thiết để tạo lại các thay đổi một cách chính xác cho các tệp đó. Tính năng này có tên là Skyfocus.

Để sử dụng Skyfocus, hãy truyền cờ --experimental_enable_skyfocus:

bazel build //pkg:target --experimental_enable_skyfocus

Theo mặc định, nhóm hoạt động sẽ là tập hợp các tệp bên cạnh mục tiêu là tạo. Trong ví dụ này, tất cả tệp trong //pkg sẽ được giữ trong nhóm hoạt động và những thay đổi đối với các tệp nằm ngoài nhóm đang làm việc sẽ không được cho phép, cho đến khi bạn bazel clean hoặc khởi động lại máy chủ Bazel.

Nếu bạn muốn chỉ định một tập hợp tệp hoặc thư mục chính xác, hãy sử dụng Cờ --experimental_working_set, như sau:

bazel build //pkg:target --experimental_enable_skyfocus
--experimental_working_set=path/to/another/dir,path/to/tests/dir

Bạn cũng có thể chuyển --experimental_skyfocus_dump_post_gc_stats để hiển thị mức giảm bộ nhớ:

Tổng kết lại, bạn sẽ thấy như sau:

$ 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

Trong ví dụ này, việc sử dụng Skyfocus cho phép Bazel giảm 561MB (45%) bộ nhớ, và các bản dựng tăng dần để xử lý các thay đổi đối với tệp trong dir1, dir2dir3/subdir sẽ duy trì được tốc độ nhanh, nhưng đổi lại thì Bazel không được như vậy tạo lại các tệp đã thay đổi bên ngoài các thư mục này.

Phân tích bộ nhớ

Bazel đi kèm với một trình phân tích bộ nhớ tích hợp có thể giúp bạn kiểm tra sử dụng bộ nhớ. Đọc thêm về quy trình này trên trang Phần Phân tích bộ nhớ trong tài liệu về cách cải thiện hiệu suất của các quy tắc tuỳ chỉnh.