場合によっては、Azure Batch ソリューションでタスクとアプリケーションのエラーを処理することが必要になる場合があります。 この記事では、さまざまな種類の Batch エラーと、一般的な問題を解決する方法について説明します。
エラー コード
Batch で発生する可能性がある一般的なエラーの種類を次に示します。
- Batch に到達しなかった要求のネットワーク エラー、または Batch 応答が時間内にクライアントに到達しなかった場合のネットワークエラー。
- 内部サーバー エラー。 これらのエラーには、標準の
5xx
状態コード HTTP 応答があります。 - スロットリング関連のエラー。 これらのエラーには、
429
ヘッダーを含む503
またはRetry-after
状態コードの HTTP 応答が含まれます。 -
4xx
AlreadyExists
やInvalidOperation
などのエラーが発生します。 これらのエラーは、リソースが状態遷移に対して正しい状態ではないことを示します。
特定のエラー コードの詳細については、「 バッチの状態とエラー コード」を参照してください。 このリファレンスには、REST API、Batch サービス、およびジョブ タスクとスケジュールのエラー コードが含まれています。
アプリケーションのエラー
実行中に、アプリケーションによって診断出力が生成される場合があります。 この出力を使用して、問題のトラブルシューティングを行うことができます。 Batch サービスは、コンピューティング ノード上のタスク ディレクトリ内の stdout.txt ファイルと stderr.txt ファイルに標準出力と標準エラー出力を書き込みます。 詳細については、「 Batch のファイルとディレクトリ」を参照してください。
これらの出力ファイルをダウンロードするには、Azure portal またはいずれかの Batch SDK を使用します。 たとえば、トラブルシューティングのためにファイルを取得するには、Batch .NET ライブラリで ComputeNode.GetNodeFile と CloudTask.GetNodeFile を使用します。
タスク エラー
タスク エラーは、いくつかのカテゴリに分類されます。
前処理エラー
タスクの開始に失敗した場合、タスクの前処理エラーが設定されます。 前処理エラーは、次の場合に発生する可能性があります。
- タスクのリソース ファイルが移動しました。
- ストレージ アカウントは使用できなくなりました。
- 別の問題が発生し、ノードへのファイルのコピーが正常に行われなかった。
ファイルのアップロード エラー
タスクに指定したファイルが何らかの理由でアップロードに失敗した場合、タスクに対してファイルのアップロード エラーが設定されます。 ファイルのアップロード エラーは、次の場合に発生する可能性があります。
- Azure Storage にアクセスするために指定された Shared Access Signature (SAS) トークンが無効です。
- SAS トークンは書き込みアクセス許可を提供しません。
- ストレージ アカウントは使用できなくなりました。
- ノードからのファイルのコピーが正常に行われなかったという別の問題が発生しました。
アプリケーション エラー
タスクのコマンド ラインで指定されたプロセスも失敗する可能性があります。 詳細については、「 タスク終了コード」を参照してください。
アプリケーション エラーの場合は、指定した回数までタスクを自動的に再試行するように Batch を構成します。
制約エラー
ジョブまたはタスクの最大実行時間を指定するには、 maxWallClockTime
制約を設定します。 この設定を使用して、進行に失敗したタスクを終了します。
タスクが最大時間を超えた場合:
- タスクは完了としてマーク されます。
- 終了コードは
0xC000013A
に設定されます。 -
schedulingError フィールドは
{ category:"ServerError", code="TaskEnded"}
としてマークされます。
タスク終了コード
タスクがプロセスを実行すると、Batch はタスクの終了コード プロパティにプロセスのリターン コードを設定します。 プロセスから 0 以外の終了コードが返された場合、Batch サービスはタスクを失敗としてマークします。
Batch サービスは、タスクの終了コードを決定しません。 プロセス自体、またはプロセスが実行されるオペレーティング システムによって、終了コードが決定されます。
タスクの失敗または中断
タスクが失敗したり、中断されたりすることがあります。 例えば次が挙げられます。
- タスク アプリケーション自体が失敗する可能性があります。
- タスクが実行されているノードが再起動する可能性があります。
- サイズ変更操作によって、ノードがプールから削除される場合があります。 このアクションは、プールの割り当て解除ポリシーがタスクの完了を待たずにノードを直ちに削除した場合に発生する可能性があります。
いずれの場合も、Batch は別のノードで実行するためにタスクを自動的に再キューできます。
また、断続的な問題によってタスクの応答が停止したり、実行に時間がかかりすぎる場合もあります。 タスクの最大実行間隔を設定できます。 タスクが間隔を超えると、Batch サービスによってタスク アプリケーションが中断されます。
コンピューティング ノードに接続する
リモートでコンピューティング ノードにサインインすることで、デバッグとトラブルシューティングを実行できます。 Azure portal を使用して、Windows ノード用のリモート デスクトップ プロトコル (RDP) ファイルをダウンロードし、Linux ノードの Secure Shell (SSH) 接続情報を取得します。 この情報は 、Batch .NET または Batch Python API を使用してダウンロードすることもできます。
RDP または SSH 経由でノードに接続するには、最初にノードにユーザーを作成します。 以下のいずれかの方法を使用します。
- Azure Portal
- 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: enablescheduling
- Batch .NET API: ComputeNode.EnableScheduling
これらのアクションを使用して、ノードで現在実行されている Batch ハンドル タスクを指定できます。 たとえば、Batch .NET API でタスク スケジュールを無効にする場合、 DisableComputeNodeSchedulingOption の列挙値を指定できます。 以下を選択できます:
- 実行中のタスクを終了します。
Terminate
- 他のノードでのスケジュール設定のためにタスクをキューを戻す:
Requeue
- アクションを実行する前に、実行中のタスクの完了を許可します。
TaskCompletion
エラー後の再試行
Batch API は、エラーについて通知します。 組み込みのグローバル再試行ハンドラーを使用して、すべての API を再試行できます。 このオプションを使用することをお勧めします。
障害が発生した後、再試行する前に数秒待ちます。 再試行頻度が高すぎるか、または速すぎる場合、再試行ハンドラーは要求を制限します。