이 페이지에서는 원격 실행 컨텍스트에서 캐시 적중률을 확인하고 캐시 부적중을 조사하는 방법을 설명합니다.
이 페이지에서는 원격 실행을 성공적으로 활용하는 빌드 또는 테스트가 있고 원격 캐시를 효과적으로 활용하고 있다고 가정합니다.
캐시 적중률 확인
Bazel 실행의 표준 출력에서 프로세스를 나열하는 INFO 행을 확인합니다. 이 행은 Bazel 작업에 대략적으로 해당합니다. 이 행은 작업이 실행된 위치를 자세히 설명합니다. 원격으로 실행된 작업을 나타내는 remote 라벨, 로컬 샌드박스에서 실행된 작업의 linux-sandbox 및 기타 실행 전략의 기타 값을 찾습니다. 결과가 원격 캐시에서 나온 작업은 remote cache hit로 표시됩니다.
예를 들면 다음과 같습니다.
INFO: 11 processes: 6 remote cache hit, 3 internal, 2 remote.
이 예에서는 6개의 원격 캐시 적중이 있었고 2개의 작업은 캐시 적중이 없었으며
원격으로 실행되었습니다. 3개의 내부 부분은 무시해도 됩니다.
일반적으로 심볼릭 링크 만들기 등의 작은 내부 작업입니다. 이 요약에는 로컬
캐시 적중이 포함되지 않습니다. 0개의 프로세스
(또는 예상보다 낮은 수)가 표시되면 bazel clean을 실행한 후 빌드/테스트
명령어를 실행합니다.
캐시 적중 문제 해결
예상한 캐시 적중률이 표시되지 않으면 다음을 실행합니다.
동일한 빌드/테스트 명령어를 다시 실행하면 캐시 적중이 생성되는지 확인
캐시를 채울 것으로 예상되는 빌드 또는 테스트를 실행합니다. 특정 스택에서 새 빌드를 처음 실행할 때는 원격 캐시 적중이 없을 것으로 예상할 수 있습니다. 원격 실행의 일부로 작업 결과가 캐시에 저장되고 후속 실행에서 이를 선택해야 합니다.
bazel clean을 실행합니다. 이 명령어는 로컬 캐시를 정리하므로 로컬 캐시 적중으로 결과가 마스크되지 않고도 원격 캐시 적중을 조사할 수 있습니다.조사 중인 빌드 및 테스트를 동일한 머신에서 다시 실행합니다.
INFO행에서 캐시 적중률을 확인합니다.remote cache hit및internal을 제외한 프로세스가 표시되지 않으면 캐시가 올바르게 채워지고 액세스되고 있는 것입니다. 이 경우 다음 섹션으로 건너뜁니다.불일치의 가능성이 높은 원인은 빌드의 비밀폐형으로 인해 두 실행에서 작업이 서로 다른 작업 키를 수신하는 것입니다. 이러한 작업을 찾으려면 다음을 실행합니다.
a. 실행 로그를 가져오려면 문제의 빌드 또는 테스트를 다시 실행합니다.
bazel cleanbazel --optional-flags build //your:target --execution_log_binary_file=/tmp/exec1.logb. 두 실행 간의 실행 로그를 비교합니다. 두 로그 파일에서 작업이 동일한지 확인합니다. 불일치는 실행 간에 발생한 변경사항에 관한 단서를 제공합니다. 빌드를 업데이트하여 이러한 불일치를 없앱니다.
캐싱 문제를 해결하고 이제 반복 실행에서 모든 캐시 적중이 생성되면 다음 섹션으로 건너뜁니다.
작업 ID는 동일하지만 캐시 적중이 없으면 구성의 일부 가 캐싱을 방지하는 것입니다. 이 섹션을 계속 진행하여 일반적인 문제를 확인합니다.
실행 로그를 비교할 필요가 없는 경우 사람이 읽을 수 있는
--execution_log_json_file플래그를 대신 사용할 수 있습니다. 실행 시간이 포함되어 있고 순서를 보장하지 않으므로 안정적인 비교에는 사용할 수 없습니다.실행 로그의 모든 작업에서
cacheable이 true로 설정되어 있는지 확인합니다. 특정 작업의 실행 로그에cacheable이 표시되지 않으면 해당 규칙에no-cache태그가 파일의 정의에 있을 수 있습니다.BUILD실행 로그에서 사람이 읽을 수 있는progress_message필드를 확인하여 작업이 어디에서 발생했는지 확인합니다.작업이 동일하고
cacheable이지만 캐시 적중이 없으면 명령어 줄에 빌드의 캐시 조회를 사용 중지하는--noremote_accept_cached가 포함되어 있을 수 있습니다.실제 명령어 줄을 파악하기 어려운 경우 빌드 이벤트 프로토콜의 정규 명령어 줄을 다음과 같이 사용합니다.
a. 텍스트의 로그 버전을 얻으려면 Bazel 명령어에
--build_event_text_file=/tmp/bep.txt를 추가하세요.b. 로그의 텍스트 버전을 열고
structured_command_line메시지를 검색합니다command_line_label: "canonical". 확장 후 모든 옵션이 나열됩니다.c.
remote_accept_cached를 검색하고false로 설정되어 있는지 확인합니다.d.
remote_accept_cached이false인 경우 명령어 줄 또는 bazelrc 파일에서false로 설정되는 위치를 확인합니다.
머신 간 캐싱 보장
동일한 머신에서 캐시 적중이 예상대로 발생한 후 다른 머신에서 동일한 빌드/테스트를 실행합니다. 머신 간에 캐싱이 발생하지 않는다고 생각되면 다음을 실행합니다.
기존 캐시가 적중되지 않도록 빌드를 약간 수정합니다.
첫 번째 머신에서 빌드를 실행합니다.
bazel cleanbazel ... build ... --execution_log_binary_file=/tmp/exec1.log두 번째 머신에서 빌드를 실행하여 1단계의 수정사항이 포함되도록 합니다.
bazel cleanbazel ... build ... --execution_log_binary_file=/tmp/exec2.log두 실행의 실행 로그를 비교합니다. 두 실행. 로그가 동일하지 않으면 빌드 구성에서 불일치를 조사하고 호스트 환경의 속성이 빌드 중 하나로 유출되는지 조사합니다.
실행 로그 비교
실행 로그에는 빌드 중에 실행된 모든 작업의 레코드가 포함됩니다. 각 작업에는 작업 키의 모든 정보가 포함된 SpawnExec 요소가 있습니다. 따라서 로그가 동일하면 작업 캐시 키도 동일합니다.
예상대로 캐시 적중을 공유하지 않는 두 빌드의 로그를 비교하려면 다음과 같이 하세요.
각 빌드에서 실행 로그를 가져와
/tmp/exec1.log및/tmp/exec2.log로 저장합니다.Bazel 소스 코드를 다운로드하고 아래 명령어를 사용하여 Bazel 폴더로 이동합니다. execlog 파서로 실행 로그를 파싱하려면 소스 코드가 필요합니다.
git clone https://github.com/bazelbuild/bazel.git cd bazel실행 로그 파서를 사용하여 로그를 텍스트로 변환합니다. 다음 호출은 비교를 용이하게 하기 위해 두 번째 로그의 작업을 첫 번째 로그의 작업 순서 와 일치하도록 정렬합니다.
bazel build src/tools/execlog:parser bazel-bin/src/tools/execlog/parser \ --log_path=/tmp/exec1.log \ --log_path=/tmp/exec2.log \ --output_path=/tmp/exec1.log.txt \ --output_path=/tmp/exec2.log.txt선호하는 텍스트 비교 도구를 사용하여
/tmp/exec1.log.txt와/tmp/exec2.log.txt를 비교합니다.