本頁說明如何檢查快取命中率,以及如何在遠端執行的情況下調查快取遺漏情形。
本頁面假設您有成功使用遠端執行功能的建構作業和/或測試,且您想確保有效使用遠端快取。
檢查快取命中率
在 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_binary_file=/tmp/exec1.log
b. 比較兩次執行作業的執行記錄。確認兩個記錄檔中的動作相同。差異可提供執行期間發生變更的線索。請更新建構項目,以消除這些差異。
如果您能夠解決快取問題,且現在重複執行作業會產生所有快取命中,請跳至下一節。
如果動作 ID 相同,但沒有任何快取命中,則表示設定中的某些項目會阻止快取。請繼續閱讀本節,檢查常見問題。
如果您不需要比較執行記錄,可以改用人類可讀的
--execution_log_json_file
旗標。由於這項方法包含執行時間,且不保證順序,因此無法用於穩定差異比較。請確認執行記錄中的所有動作都已將
cacheable
設為 true。如果cacheable
未出現在特定動作的執行記錄中,表示對應的規則在BUILD
檔案的定義中可能有no-cache
標記。請查看執行記錄中的使用者可讀取的progress_message
欄位,協助判斷動作來源。如果動作相同且
cacheable
,但沒有快取命中,則指令列可能包含--noremote_accept_cached
,這會停用建構的快取查詢。如果無法判斷實際指令列,請使用 Build Event Protocol 中的標準指令列,如下所示:
a. 在 Bazel 指令中新增
--build_event_text_file=/tmp/bep.txt
,即可取得文字版本的記錄檔。b. 開啟文字版本的記錄檔,搜尋含有
command_line_label: "canonical"
的structured_command_line
訊息。展開後,系統會列出所有選項。c. 搜尋
remote_accept_cached
,並確認是否已設為false
。d. 如果
remote_accept_cached
是false
,請判斷false
的設定位置:指令列或 bazelrc 檔案。
確保跨機器快取
在同一部機器上正常觸發快取後,請在其他機器上執行相同的建構作業/測試。如果您懷疑系統未在多台機器上進行快取,請採取下列做法:
對建構項目進行小幅修改,避免命中現有的快取。
在第一台電腦上執行建構作業:
bazel clean
bazel ... build ... --execution_log_binary_file=/tmp/exec1.log
在第二部機器上執行建構作業,確保包含步驟 1 中的修改內容:
bazel clean
bazel ... 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
。