本頁說明如何查看快取命中率及調查方式 執行遠端執行時,發生快取失敗的情況。
本頁假設您已順利建構和/或測試 必須能從遠端執行作業,並想確保自己有效率 利用遠端快取
檢查快取命中率
在 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 clean
bazel --optional-flags build //your:target --execution_log_compact_file=/tmp/exec1.log
b. 比較兩次執行作業的執行記錄。請確認兩個記錄檔中的動作相同。差異可提供執行期間發生變更的線索。請更新建構項目,以消除這些差異。
如果您能解決快取問題,而且現在重複執行 產生的所有快取命中,請跳至下一個部分。
如果您的動作 ID 相同,但沒有快取命中, 設定中禁止快取。接著本節,即可: 檢查是否有常見問題
確認執行記錄中的所有動作都將
cacheable
設為 true。如果cacheable
不會顯示在授權動作的執行記錄中, 代表相對應的規則可能在包含no-cache
標記BUILD
檔案中的定義。查看mnemonic
和target_label
欄位,協助判斷動作會前往何處如果動作相同且
cacheable
,但沒有快取命中, 您的指令列可能包含--noremote_accept_cached
會停用建構的快取查詢功能。如果很難確定實際的命令列,請使用 從指令列啟動 建立事件協定 如下所示:
a. 將
--build_event_text_file=/tmp/bep.txt
新增至 Bazel 指令, 文字版記錄檔b. 開啟文字版記錄,然後搜尋
structured_command_line
則含有「command_line_label: "canonical"
」的訊息。 展開後,系統會列出所有選項。c. 搜尋
remote_accept_cached
,檢查是否已設為false
。d. 如果
remote_accept_cached
為false
,請判斷其位置 設為false
:在指令列或 bazelrc 檔案。
確保跨機器快取
在同一部機器上正常觸發快取後,請在其他機器上執行相同的建構作業/測試。如果您懷疑系統未在多台機器上執行快取,請採取下列做法:
對建構項目進行小幅修改,避免命中現有的快取。
在第一部機器上執行建構:
bazel clean
bazel ... build ... --execution_log_compact_file=/tmp/exec1.log
在第二部機器上執行建構作業,確保包含步驟 1 中的修改內容:
bazel clean
bazel ... build ... --execution_log_compact_file=/tmp/exec2.log
比較兩者的執行記錄檔 或任何可執行 Knative 的環境中如果記錄不相同,請調查您的建構設定是否有差異,以及主機環境的屬性是否會流入任一建構。
比較執行記錄檔
執行記錄包含建構期間所執行動作的記錄。 每個記錄都會說明動作的輸入內容 (不僅是檔案,還包括指令列引數、環境變數等) 和輸出內容。因此, 檢查記錄即可找出重新執行動作的原因。
執行記錄可產生三種格式之一:精簡 (--execution_log_compact_file
)、二進位 (--execution_log_binary_file
) 或 JSON (--execution_log_json_file
)。建議使用精簡格式,因為這類格式產生的檔案較小,且執行階段的額外負擔也較少。以下操作說明適用於任何格式。個人中心
也可以使用 //src/tools/execlog:converter
工具在兩者之間轉換。
如要比較兩個未如預期共用快取命中的記錄檔, :
從每個版本取得執行記錄,並儲存為
/tmp/exec1.log
和/tmp/exec2.log
。下載 Bazel 原始碼,並建構
//src/tools/execlog:parser
工具:git clone https://github.com/bazelbuild/bazel.git cd bazel bazel build //src/tools/execlog:parser
使用
//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
。