Azure Batch 中的錯誤處理和偵測
有時候,您可能需要處理 Azure Batch 解決方案中的工作和應用程式失敗。 本文說明不同類型的 Batch 錯誤,以及如何解決常見問題。
錯誤碼
您可能會在 Batch 中看到的某些一般錯誤類型如下:
- 從未達到 Batch 要求的網路失敗,或 Batch 回應未及時到達用戶端時的網路失敗。
- 內部伺服器錯誤。 這些錯誤具有標準
5xx
狀態碼 HTTP 回應。 - 節流相關錯誤。 這些錯誤包括
429
或503
狀態碼 HTTP 回應與Retry-after
標頭。 4xx
錯誤,例如AlreadyExists
和InvalidOperation
。 這些錯誤表示資源未處於狀態轉換的正確狀態。
如需關於特定錯誤碼的詳細資訊,請參閱 Batch 狀態和錯誤碼。 此參考包含 REST API、Batch 服務和作業工作與排程的錯誤碼。
應用程式失敗
在執行期間,應用程式可能會產生診斷輸出。 您可使用此輸出對問題進行排解疑難。 Batch 服務會將標準輸出和標準錯誤輸出寫入計算節點上工作目錄中的 stdout.txt 和 stderr.txt 檔案。 如需詳細資訊,請參閱 Batch 中的檔案和目錄。
若要下載這些檔案,請使用 Azure 入口網站或其中一個 Batch SDK。 例如,若要擷取檔案以供疑難排解,請使用 Batch .NET 程式庫中的 ComputeNode.GetNodeFile 和 CloudTask.GetNodeFile。
工作錯誤
工作錯誤分為數個類別。
前置處理錯誤
如果工作無法啟動,系統便會對該工作設定前置處理錯誤。 若發生以下情況,可能出現前置處理錯誤:
- 工作的資源檔已移動。
- 儲存體帳戶已無法使用。
- 發生另一個問題,導致無法成功將檔案複製到節點。
檔案上傳錯誤
如果在上傳針對工作指定的檔案時因故失敗,系統會對該工作設定檔案上傳錯誤。 若發生以下情況,可能出現檔案上傳錯誤:
- 提供以存取 Azure 儲存體的共用存取簽章 (SAS) 權杖無效。
- SAS 權杖不提供寫入權限。
- 儲存體帳戶已無法使用。
- 發生另一個問題,導致無法成功從節點複製檔案。
應用程式錯誤
工作的命令列所指定的程序也可能會失敗。 如需詳細資訊,請參閱工作結束代碼。
針對應用程式錯誤,可將 Batch 設定成自動重試工作直到指定的次數為止。
條件約束錯誤
若要指定作業或工作的最大執行持續期間,請設定 maxWallClockTime
條件約束。 使用此設定來終止無法進行的工作。
當工作超過最大時間時:
- 會將工作標記為已完成。
- 結束代碼設定為
0xC000013A
。 - schedulingError 欄位標示為
{ category:"ServerError", code="TaskEnded"}
。
工作結束代碼
當工作執行一個程序時,Batch 會使用「程序的傳回代碼」填入工作的結束代碼屬性。 如果程序傳回非零的結束代碼,Batch 服務會將工作標示為失敗。
Batch 服務不會判斷工作的結束代碼。 工作的結束代碼取決於程序本身,或程序執行所在的作業系統。
工作失敗或中斷
工作可能偶爾會失敗或中斷。 例如:
- 工作應用程式本身可能會失敗。
- 工作執行所在的節點可能會重新開機。
- 調整大小作業可能會從集區中移除節點。 如果集區的解除配置原則立即移除節點,而沒有等待工作完成,就可能發生此動作。
在所有的情況下,此工作均可由 Batch 自動重新排入佇列,並且在另一個節點上執行。
也可能是間歇性問題導致工作停止回應或花太長時間執行。 您可以設定工作的執行間隔上限。 若工作超出間隔,Batch 服務便會中斷工作應用程式。
連線到計算節點
您可以從遠端登入計算節點,以執行偵錯和疑難排解。 使用 Azure 入口網站下載 Windows 節點的遠端桌面通訊協定 (RDP) 檔案,並取得 Linux 節點的安全殼層 (SSH) 連線資訊。 您也可以使用 Batch .NET 或 Batch Python API 下載此資訊。
若要透過 RDP 或 SSH 連接到節點,請先在節點上建立使用者。 使用下列其中一種方法:
- Azure 入口網站
- Batch REST API:adduser
- Batch .NET API:ComputeNode.CreateComputeNodeUser
- Batch Python 模組:add_user
如有必要,設定或停用對計算節點的存取。
針對問題節點進行疑難排解
您的 Batch 用戶端應用程式或服務可檢查失敗工作的中繼資料,以識別問題節點。 集區中的每個節點都有唯一識別碼。 工作中繼資料包含工作執行所在的節點。 找到問題節點之後,請嘗試使用下列方法來解決失敗。
重新啟動節點
重新啟動節點有時可以修復潛在的問題,例如停滯或損毀的程序。 如果集區使用啟動工作,或作業使用作業準備工作,則在節點重新啟動時會執行這些工作。
- Batch REST API:reboot
- Batch .NET API:ComputeNode.Reboot
為節點重新安裝映像
為節點重新安裝映像會重新安裝作業系統。 在重新安裝映像發生之後,啟動工作和作業準備工作會重新執行。
- Batch REST API:reimage
- Batch .NET API:ComputeNode.Reimage
從集區中移除節點
有時需要從集區中移除節點。
- Batch REST API:removenodes
- Batch .NET API:PoolOperations
停用節點上的工作排程
在節點上停用工作排程會有效地讓節點離線。 Batch 不會將進一步的工作指派給節點。 不過,節點會繼續在集區中執行。 然後,您便可進一步調查失敗,而不會遺失失敗工作的資料。 節點也不會造成更多工作的失敗。
例如,停用節點上的工作排程。 然後,從遠端登入節點。 檢查事件記錄檔,並執行其他疑難排解。 解決問題之後,再次啟用工作排程,讓節點重新連線。
- Batch REST API:enablescheduling
- Batch .NET API:ComputeNode.EnableScheduling
您可以使用這些動作來指定 Batch 處理目前在節點上執行的工作。 例如,當您使用 Batch .NET API 停用工作排程時,您可以指定 DisableComputeNodeSchedulingOption 的列舉值。 您可以選擇:
- 終止執行中的工作:
Terminate
- 重新排入佇列工作,以在其他節點上排程:
Requeue
- 執行動作之前,允許執行中的工作:
TaskCompletion
錯誤後重試
Batch API 會通知您失敗。 您可以使用內建的全域重試處理常式重試所有 API。 最佳做法是使用此選項。
失敗之後,請等候數秒後再重試。 如果您太頻繁或太快重試,重試處理常式要求將會節流。