메모리 최적화

문제 신고 소스 보기 Nightly · 8.0 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

이 페이지에서는 Bazel이 사용하는 메모리를 제한하고 줄이는 방법을 설명합니다.

제한된 RAM으로 Bazel 실행

경우에 따라 Bazel이 최소한의 메모리를 사용하도록 할 수 있습니다. --host_jvm_args=-Xmx2g와 같이 시작 플래그 --host_jvm_args를 통해 최대 힙을 설정할 수 있습니다.

메모리와 증분 빌드 속도 교환

빌드가 너무 크면 메모리가 충분하지 않을 때 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에는 규칙의 메모리 사용량을 확인하는 데 도움이 되는 메모리 프로파일러가 내장되어 있습니다. 맞춤 규칙의 성능을 개선하는 방법에 관한 문서의 메모리 프로파일링 섹션에서 이 프로세스에 대해 자세히 알아보세요.