有時候,您可能需要處理 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 用戶端應用程式或服務可以檢查失敗工作的元數據,以識別問題節點。 集區中的每個節點都有唯一ID。 工作元數據包含工作執行所在的節點。 找到問題節點之後,請嘗試下列方法來解決失敗。
重新啟動節點
重新啟動節點有時會修正潛在問題,例如停滯或當機的進程。 如果您的集區使用啟動工作,或您的作業使用作業準備工作,那麼節點重新啟動會執行這些工作。
- Batch REST API: 重新啟動
- Batch .NET API: ComputeNode.Reboot
重新映像節點
重新灌製節點會重新安裝作業系統。 重新映射發生之後,啟動工作和作業準備工作會重新執行。
- Batch REST API:重置映像
- Batch .NET API: ComputeNode.Reimage
從集區移除節點
在某些情況下,需要從集區中移除節點。
- Batch REST API: removenodes
- Batch .NET API: PoolOperations
在節點上停用任務排程
停用節點上的工作排程可有效地讓節點離線。 Batch 不會將任何進一步的工作指派給節點。 不過,節點會繼續在集區中運行。 然後,您可以進一步調查失敗,而不會遺失失敗的工作數據。 節點也不會造成更多任務失敗。
例如,停用節點上的工作排程。 然後,從遠端登入節點。 檢查事件記錄檔,並進行其他故障排除。 解決問題之後,請再次啟用工作排程,讓節點重新上線。
- Batch REST API:啟用排程
- Batch .NET API: ComputeNode.EnableScheduling
您可以使用這些動作來指定 Batch 處理目前在節點上執行的工作。 例如,當您使用 Batch .NET API 停用工作排程時,您可以指定 DisableComputeNodeSchedulingOption 的列舉值。 您可以選擇:
- 終止執行中的工作:
Terminate - 重新排程其他節點上的工作:
Requeue - 在執行動作之前,允許執行中工作完成:
TaskCompletion
錯誤後重試
Batch API 會通知您有關失敗的情況。 您可以使用內建的全域重試處理程式重試所有 API。 最佳做法是使用此選項。
失敗之後,請等候數秒再重試。 如果您重試太頻繁或太快,重試處理程式會節流要求。