我的 AWS Batch 運算環境中的工作失敗,並傳回下列錯誤: 「DockerTimeoutError: 無法轉移至已建立;等待 4m0s 後逾時。」 如何對 AWS Batch 中的「DockerTimeoutError」錯誤進行疑難排解?
簡短描述
如果您的 docker start 和 docker create API 呼叫花費的時間超過四分鐘,則 AWS Batch 傳回 DockerTimeoutError 錯誤。
**注意:**Amazon Elastic Container Service (Amazon ECS) 容器代理程式設定的預設逾時限制為四分鐘。
發生該錯誤的原因很多,但通常是由下列其中一項原因所造成:
- AWS Batch 運算環境的 ECS 執行個體磁碟區承受佇列中所有其他工作的高 I/O 壓力。這些在 ECS 執行個體上建立並執行的工作可能會耗盡突發平衡。若要解決此問題,請依照本文中解決任何突發平衡問題一節中的步驟執行。
- 清理已停止的 ECS 容器的速度不夠快,無法釋放 Docker 常駐程式。如果您使用自訂 Amazon Machine Image (AMI) 而不是 AWS Batch 提供的預設 AMI,則可能會遇到 Docker 問題。AWS Batch 的預設 AMI 可最佳化您的 Amazon ECS 清理設定。若要解決此問題,請依照本文中解決任何 Docker 問題一節中的步驟執行。
如果這些問題都不是造成錯誤的原因,則可以透過執行下列動作進一步對此問題進行疑難排解:
解決方法
解決任何突發平衡問題
檢查 ECS 執行個體的突發平衡
-
開啟 Amazon ECS 主控台。
-
在導覽窗格中,選取叢集。然後,選擇包含您的工作的叢集。
**注意:**叢集名稱以運算環境的名稱開頭,後接 _Batch_ 及數字和字母的隨機雜湊。
-
選擇 ECS 執行個體標籤。
-
從 EC2 執行個體欄中,選擇您的執行個體。
**注意:**若要尋找失敗工作的執行個體 ID,請執行 AWS Batch describe-jobs 命令。執行個體 ID 會顯示在 containerInstanceArn 的輸出中。
-
在 Amazon EC2 主控台的說明標籤上,從區塊型儲存裝置中選擇您的磁碟區的連結。
-
在區塊型儲存裝置快顯視窗中,為 EBS ID 選擇您的磁碟區。
-
選擇監控標籤。然後,選擇突發平衡以檢查您的突發平衡指標。如果您的突發平衡降到 0,則表示您的突發平衡已耗盡。
為您的受管運算環境建立啟動範本
**注意:**如果您變更啟動範本,您必須建立新的運算環境。
-
開啟 Amazon EC2 主控台,然後選擇啟動範本。
-
選擇建立啟動範本。
-
對於 AMI ID,選取預設的 Amazon ECS 最佳化 AMI。
-
在儲存 (磁碟區) 區段中,從磁碟區類型欄位中選擇磁碟區類型。然後,在大小 (GiB) 欄位中輸入整數值。
**注意:**如果為磁碟區類型選擇](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumeTypes.html#EBSVolumeTypes_piops)佈建 IOPS SSD (io1)[,請輸入 IOPS 允許的整數值。
-
選擇建立啟動範本。
-
使用新的啟動範本建立新的受管運算環境。
使用您的 AMI 建立 AWS Batch 運算環境
**注意:**如果您變更 AMI,則必須建立新的運算環境,因為無法更新 AMI ID 參數。
1. 開啟 Amazon EC2 主控台。
-
選擇啟動執行個體。
-
依照設定精靈中的步驟建立您的執行個體。
重要:在新增儲存頁面上,修改執行個體的磁碟區類型或大小。磁碟區越大,基準效能越高,且磁碟區補充突發平衡的速度也越慢。若要取得高 I/O 負載的較佳效能,請將磁碟區變更為 io1 類型。
-
從執行個體建立運算資源 AMI。
-
為包含您的 AMI ID 的 AWS Batch 建立運算環境。
解決任何 Docker 問題
預設情況下,Amazon ECS 容器代理程式會自動清除已停止的工作和容器執行個體未使用的 Docker 映像檔。如果您使用新映像檔執行新工作,則容器儲存空間可能會填滿未使用的 Docker 映像檔。
-
對您的 AWS Batch 運算環境使用 SSH 連接到容器執行個體。
-
若要檢查 Amazon ECS 容器代理程式,請執行 Docker inspect ecs-agent 命令。然後,檢閱輸出中的 env 部分。
**注意:**您可以減小以下變數的值,以加快工作和映像清理速度:
- ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION
- ECS_IMAGE_CLEANUP_INTERVAL
- ECS_IMAGE_MINIMUM_CLEANUP_AGE
- ECS_NUM_IMAGES_DELETE_PER_CYCLE
您也可以對自動工作和映像清理使用可調整參數。
- 使用更新的值建立新的 AMI。
-或-
使用包含新環境變數的使用者資料建立啟動範本。
使用更新的值建立新的 AMI
-
在 /etc/ecs/ecs.config 檔案中設定您的代理程式組態參數。
-
重新啟動容器代理程式。
-
從執行個體建立運算資源 AMI。
-
為包含您的 AMI ID 的 AWS Batch 建立運算環境。
使用包含新環境變數的使用者資料建立啟動範本
- 使用使用者資料建立啟動範本。
例如,下列 MIME 分段檔案中的使用者資料會覆寫運算資源的預設 Docker 映像清理設定:
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="
--==MYBOUNDARY==
Content-Type: text/x-shellscript; charset="us-ascii"
#!/bin/bash
echo ECS_IMAGE_CLEANUP_INTERVAL=60m >> /etc/ecs/ecs.config
echo ECS_IMAGE_MINIMUM_CLEANUP_AGE=60m >> /etc/ecs/ecs.config
--==MYBOUNDARY==--
- 使用新的啟動範本建立受管運算環境。
相關資訊
發佈 CloudWatch 指標的 AWS 服務
運算資源 AMI
amazon-ecs-agent (AWS GitHub)