Trang này mô tả cách giới hạn và giảm 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.
Đánh đổi tốc độ xây dựng gia tăng để lấy bộ nhớ
Nếu bản dựng của bạn quá lớn, Bazel có thể gửi lỗi OutOfMemoryError (OOM) khi không có đủ bộ nhớ. Bạn có thể yêu cầu Bazel sử dụng ít bộ nhớ hơn (đánh đổi bằng việc
bản dựng gia tăng sẽ 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.
Các cờ này sẽ giảm thiểu bộ nhớ mà Bazel sử dụng trong một bản dựng, đánh đổi bằng việc các bản dựng trong tương lai sẽ chậm hơn so với bản dựng gia tăng tiêu chuẩn.
Bạn cũng có thể truyền riêng từng cờ trong số này:
--discard_analysis_cachesẽ giảm bộ nhớ được sử dụng trong quá trình thực thi (không phải phân tích). 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 thực hiện 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 các lần thực thi lại).--notrack_incremental_statesẽ không lưu trữ bất kỳ cạnh nào trong biểu đồ phần phụ thuộc nội bộ của Bazel, do đó, không thể sử dụng cho bản dựng gia tăng. Bản dựng tiếp theo sẽ loại bỏ dữ liệu đó, nhưng dữ liệu này được giữ lại cho đến lúc đó để gỡ lỗi nội bộ, trừ phi bạn chỉ định--nokeep_state_after_build.--nokeep_state_after_buildsẽ loại bỏ tất cả dữ liệu sau bản dựng, để bản dựng gia tăng phải xây dựng từ đầu (ngoại trừ bộ nhớ đệm hành động trên đĩa). Cờ này không ảnh hưởng đến dấu hiệu mức cao nhất của bản dựng hiện tại.
Đánh đổi tính linh hoạt của bản dựng để lấy bộ nhớ bằng Skyfocus (Thử nghiệm)
Nếu muốn Bazel sử dụng ít bộ nhớ hơn và giữ lại tốc độ xây dựng gia tăng, bạn có thể cho Bazel biết tập hợp tệp đang hoạt động mà bạn sẽ sửa đổi. Bazel sẽ chỉ giữ lại trạng thái cần thiết để xây dựng lại các thay đổi đối với những tệp đó một cách chính xác. Tính năng này được gọi 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, tập hợp đang hoạt động sẽ là tập hợp tệp bên cạnh mục tiêu đang được xây dựng. Trong ví dụ này, tất cả tệp trong //pkg sẽ được giữ trong tập hợp đang hoạt động và các thay đổi đối với tệp bên ngoài tập hợp đang hoạt động sẽ không được phép cho đến khi bạn phát hành 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ể truyền --experimental_skyfocus_dump_post_gc_stats để hiển thị mức giảm bộ nhớ:
Khi kết hợp tất cả 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 561 MB (45%) bộ nhớ và các bản dựng gia tăng để xử lý các thay đổi đối với tệp trong dir1, dir2 và dir3/subdir sẽ giữ lại tốc độ nhanh, đánh đổi bằng việc Bazel không thể xây dựng 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 mức sử dụng bộ nhớ của quy tắc. Đọc thêm về quy trình này trong phần Phân tích bộ nhớ của 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.