이 페이지에서는 Bazel을 실행할 때 Bazel의 빌드 성능을 최적화하는 방법을 설명합니다. 합니다.
Bazel의 런타임 상태
Bazel 호출에는 여러 상호작용 부분이 포함됩니다.
bazel
명령줄 인터페이스 (CLI)는 사용자 대상 프런트엔드 도구입니다. 사용자로부터 명령을 수신합니다.CLI 도구가 Bazel 서버를 시작합니다. 할 수 있습니다. Bazel 서버는 일반적으로 영구적이지만 잠시 유휴 상태가 되면 종료됨 리소스를 낭비하지 않도록 하는 것입니다
Bazel 서버는 지정된 명령어에 대한 로드 및 분석 단계를 수행합니다. (
build
,run
,cquery
등): 필요한 부분을 구성합니다. 빌드 그래프의 크기를 지정합니다. 결과 데이터 구조는 Bazel 서버를 분석 캐시의 일부로 저장합니다.또한 Bazel 서버는 작업 실행을 수행하거나 원격 실행이 가능하도록 설정된 경우 해당 작업이 중지됩니다. 결과 작업 실행도 작업 캐시에 캐시되어 실행 캐시 - 로컬 또는 원격일 수 있으며 공유될 수 있습니다. Bazel 서버 간)입니다.
Bazel 호출 결과는 출력 트리에서 사용할 수 있습니다.
Bazel 반복 실행
일반적인 개발자 워크플로에서는 코드 조각을 빌드 (또는 실행)하는 것이 일반적입니다.
매우 높은 빈도로 반복적으로 자주 반복해야 함 (예: 일부 컴파일
실패 테스트를 조사할 수 있습니다. 이러한 상황에서는
bazel
의 반복 호출은
기본적이고 반복되는 작업 (예: 컴파일러 호출 또는 테스트 실행)을 말합니다.
이를 염두에 두고 Bazel의 런타임 상태를 다시 살펴보겠습니다.
분석 캐시는 중요한 데이터 조각입니다. 많은 시간이 콜드 실행의 로딩 및 분석 단계 (즉, 실행 Bazel 서버가 시작된 후 또는 분석 캐시가 삭제된 경우). 성공적인 단일 콜드 빌드 (예: 프로덕션 버전)의 경우 이 비용은 반복할 수 있지만 동일한 타겟을 반복적으로 구축하는 경우 비용이 분할 상환되고 각 호출에서 반복되지 않습니다.
분석 캐시는 다소 변동성이 높습니다. 먼저 이는 진행 중인
상태 그대로 유지되므로 서버를 분실하면 캐시가 손실됩니다. 하지만 캐시는
또한 매우 쉽게 무효화됩니다. 예를 들어 다수의 bazel
명령줄 플래그는
캐시가 삭제됩니다. 이는 많은 플래그가 빌드에 영향을 미치기 때문입니다.
그래프 (예:
구성 가능한 속성)을 참조하세요. 일부 플래그
변경하면 Bazel 서버가 다시 시작될 수도 있습니다 (예:
시작 옵션)을 선택합니다.
좋은 실행 캐시는 빌드 성능에도 중요합니다. 실행 캐시는 로컬에 보관 가능 디스크 또는 원격으로 소통할 수 있습니다. 캐시는 여러 애플리케이션 간에 Bazel 서버, 그리고 실제로 개발자들 사이에서 말이죠.
분석 캐시 삭제 방지
분석 캐시가 삭제되었거나 분석 캐시가 삭제된 경우 Bazel은 서버가 다시 시작되었습니다. 반복적으로 사용할 때는 다음 사항 중 하나를 피해야 합니다.
반복 중에
bazel
플래그를 변경하는 것에 유의하세요. 워크플로에 따라 다릅니다. 예를 들어bazel build -c opt
와bazel cquery
를 혼합하면 각 명령어가 다른 명령어의 분석 캐시를 삭제합니다. 일반적으로 특정 워크플로 기간 동안 고정된 플래그 집합을 사용하려고 합니다Bazel 서버를 손실하면 분석 캐시가 손실됩니다. Bazel 서버에는 구성 가능한 유휴 상태 그 후에는 종료됩니다 이 경우 bazelrc 파일을 다운로드합니다. 또한 시작 시 서버가 다시 시작됨 따라서 가능하면 해당 플래그를 변경하지 않는 것이 좋습니다.
키를 누르면 Bazel 서버가 종료되므로 주의: Bazel이 실행되는 동안 Ctrl-C를 반복해서 누릅니다. 시간을 절약하고 싶은 유혹은 더 이상 필요하지 않은 실행 중인 빌드를 중단하고 Ctrl-C를 한 번 눌러 현재 호출을 단계적으로 종료하도록 요청합니다.
동일한 작업공간에서 여러 플래그 세트를 사용하려면 다음을 수행합니다.
--output_base
로 전환된 서로 다른 여러 출력 베이스 사용 플래그. 각 출력 베이스는 자체 Bazel 서버를 가져옵니다.
이 조건을 경고가 아닌 오류로 만들려면
--noallow_analysis_cache_discard
플래그 (Bazel 6.4.0에서 도입됨)