이 페이지에서는 Bazel이 사용하는 메모리를 제한하고 줄이는 방법을 설명합니다.
제한된 RAM으로 Bazel 실행
특정 상황에서는 Bazel이 최소한의 메모리를 사용하도록 할 수 있습니다. 시작 플래그
--host_jvm_args를 통해 최대 힙을 설정할 수 있습니다.
예: --host_jvm_args=-Xmx2g.
메모리를 위해 증분 빌드 속도 교환
빌드가 너무 크면 Bazel에 메모리가 충분하지 않을 때 OutOfMemoryError (OOM)가 발생할 수 있습니다. 다음 명령줄 플래그
--discard_analysis_cache,
--nokeep_state_after_build,
및
--notrack_incremental_state를 전달하여 증분 빌드 속도가 느려지는 대신 Bazel이 메모리를 덜 사용하도록 할 수 있습니다.
이러한 플래그는 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이 561MB (45%)의 메모리를 삭제하고
증분 빌드가 dir1, dir2,
dir3/subdir 아래의 파일 변경사항을 처리할 때 빠른 속도를 유지할 수 있습니다. 단, Bazel은 이러한 디렉터리 외부에서 변경된 파일을
다시 빌드할 수 없습니다.
메모리 프로파일링
Bazel에는 규칙의 메모리 사용량을 확인하는 데 도움이 되는 기본 제공 메모리 프로파일러가 포함되어 있습니다. 맞춤 규칙의 성능을 개선하는 방법에 관한 문서의 메모리 프로파일링 섹션에서 이 프로세스에 관해 자세히 알아보세요.