메모리 최적화

문제 신고 <ph type="x-smartling-placeholder"></ph> 소스 보기 1박 · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

제한된 RAM으로 Bazel 실행

특정 상황에서는 Bazel이 최소한의 메모리를 사용하도록 하는 것이 좋습니다. 이 시작 플래그를 통한 최대 힙 --host_jvm_args님, (예: --host_jvm_args=-Xmx2g)

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

빌드가 너무 크면 다음 경우에 Bazel에서 OutOfMemoryError (OOM)을 발생시킬 수 있습니다. 메모리가 충분하지 않습니다. Bazel이 적은 양의 메모리를 사용하도록 할 수 있습니다. 다음 명령어 플래그를 전달하여 더 느린 증분 빌드의 빌드를 시작하세요. --discard_analysis_cache님, --nokeep_state_after_build, 및 --notrack_incremental_state:

이러한 플래그는 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

이 예에서 Bazel은 Skyfocus를 사용하여 메모리의 561MB (45%)를 삭제할 수 있었습니다. 및 증분 빌드를 사용하여 dir1, dir2 및 하위 파일의 변경사항을 처리합니다. dir3/subdir는 빠른 속도를 유지하지만 Bazel이 사용할 수 없는 다시 빌드할 수 없습니다

메모리 프로파일링

Bazel에는 규칙의 메모리 사용량을 확인하는 데 도움이 되는 메모리 프로파일러가 내장되어 있습니다. 이 프로세스에 대해 자세히 알아보려면 메모리 프로파일링 섹션을 맞춤 규칙의 성능을 개선하는 방법에 대한 설명서가 제공됩니다.