메모리 최적화

문제 신고 소스 보기 나이틀리 빌드 · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

이 페이지에서는 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라고 합니다.

스카이포커스를 사용하려면 --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에는 규칙의 메모리 사용량을 확인할 수 있는 내장 메모리 프로파일러가 함께 제공됩니다. 맞춤 규칙의 성능을 개선하는 방법에 관한 문서의 메모리 프로파일링 섹션에서 이 프로세스에 대해 자세히 알아보세요.