Azure Batch でのエラー処理と検出

場合によって、Azure Batch ソリューションでタスクとアプリケーションのエラーを処理する必要があります。 この記事では、さまざまな種類の Batch エラーと、一般的な問題を解決する方法について説明します。

エラー コード

Batch で発生する可能性がある一般的なエラーの種類を次に示します。

  • Batch に到達しなかった要求によるネットワーク エラーや、Batch の応答が時間内にクライアントに到達しなかった場合のネットワーク エラー。
  • 内部サーバー エラー。 これらのエラーの HTTP レスポンス状態コードは標準の 5xx です。
  • スロットリング関連エラー。 これらのエラーの HTTP レスポンス状態コードは、429 または 503 で、Retry-after ヘッダが含まれます。
  • AlreadyExistsInvalidOperation などの 4xx エラー。 これらのエラーは、状態遷移でリソースが正しい状態にないことを意味します。

特定のエラー コードの詳細については、Batch の状態とエラー コードに関するページを参照してください。 このリファレンスには、REST API、Batch サービス、ジョブ タスクとスケジュール設定のエラー コードが含まれています。

アプリケーション エラー

アプリケーションの実行中に、診断情報が生成される場合があります。 この情報をもとに、問題のトラブルシューティングを行うことができます。 Batch サービスは、コンピューティング ノードのタスク ディレクトリにある stdout.txt ファイルと stderr.txt ファイルに標準出力と標準エラー出力を書き込みます。 詳細については、Batch 内のファイルとディレクトリをご覧ください。

これらの出力ファイルは Azure Portal またはいずれかの Batch SDK を使用してダウンロードすることができます。 たとえば、トラブルシューティングのためにこれらのファイルを取得するには、Batch .NET ライブラリの ComputeNode.GetNodeFileCloudTask.GetNodeFile を使用します。

タスク エラー

タスク エラーは、いくつかのカテゴリに分類できます。

前処理エラー

タスクを開始できなかった場合、そのタスクには前処理エラーが設定されます。 次の場合、前処理エラーが発生する可能性があります。

  • タスクのリソース ファイルが移動されている。
  • ストレージ アカウントが使用できなくなっている。
  • 別の問題が発生し、ノードへのファイルのコピーが正常に行えない。

ファイルのアップロード エラー

タスクに対して指定したファイルのアップロードが、なんらかの理由で失敗すると、そのタスクにはファイルのアップロード エラーが設定されます。 次の場合、ファイルのアップロード エラーが発生する可能性があります。

  • Azure Storage へのアクセスに指定された Shared Access Signature (SAS) トークンが無効。
  • SAS トークンで書き込み権限が提供されない。
  • ストレージ アカウントが使用できなくなっている。
  • 別の問題が発生し、ノードからファイルへのコピーが正常に行えない。

アプリケーション エラー

タスクのコマンド ラインで指定されたプロセスも失敗することがあります。 詳細については、タスク 終了コードに関するページをご覧ください。

アプリケーション エラーについては、Batch を構成して、指定した回数まで自動的にタスクが再試行されるようにできます。

制約エラー

ジョブまたはタスクの最大実行期間を指定するには、制約の maxWallClockTime を設定します。 この設定を使用して、進行に失敗したタスクを終了します。

タスクが最大時間を超えた場合、次の処理がされます。

  • タスクが完了とマークされる。
  • 終了コードは 0xC000013A に設定されます。
  • schedulingError フィールドが { category:"ServerError", code="TaskEnded"} としてマークされる。

タスクの終了コード

タスクでプロセスが実行されると、Batch によって、そのプロセスのリターン コードがそのタスクの終了コード プロパティに設定されます。 プロセスで 0 以外の終了コードが返された場合、Batch サービスでタスクに失敗マークが付けられます。

Batch サービスでは、タスクの終了コードは決定されません。 終了コードは、プロセス自体またはそのプロセスが実行されているオペレーティング システムによって決定されます。

タスクのエラーや中断

タスクは、エラーが発生したり中断されたりする場合があります。 次に例を示します。

  • タスク アプリケーション自体が失敗する。
  • タスクが実行されているノードが再起動する。
  • サイズ変更操作により、プールからノードが削除される。 このアクションは、プールの割り当て解除ポリシーによって、タスクが完了するのを待たずにノードをすぐに削除した場合に発生する可能性があります。

どのような場合でも、Batch によってタスクを自動的にキューに戻し、別のノードで実行することができます。

間欠的に発生する問題によって、タスクが応答を停止したり、実行に長い時間がかかるようになったりする場合もあります。 このような場合は、タスクに最大実行間隔を設定することができます。 タスクがサイクル間隔を超えると、Batch サービスによってタスク アプリケーションが中断されます。

コンピューティング ノードへの接続

リモートからコンピューティング ノードにサインインすることによって、デバッグおよびトラブルシューティングを実行できます。 Windows ノードのリモート デスクトップ プロトコル (RDP) ファイルをダウンロードしたり、Linux ノードの Secure Shell (SSH) 接続情報を取得するには、Azure Portal を使用します。 また、Batch .NETBatch Python API を使用してこの情報をダウンロードすることもできます。

RDP や SSH を通じてノードに接続するには、まず、ノード上にユーザーを作成します。 以下のいずれかの方法を使用します。

必要に応じて、コンピューティング ノードへのアクセスを構成または無効にします

問題のあるノードのトラブルシューティング

Batch クライアント アプリケーションまたはサービスで、失敗したタスクのメタデータを調べて、問題のあるノードを特定できます。 プール内の各ノードには一意の ID があります。 タスク メタデータには、タスクが実行されるノードが含まれます。 問題のノードを見つけたら、次の方法を試してエラーを解決します。

ノードの再起動

ノードを再起動すると、途中で停止したプロセスやクラッシュしたプロセスなどの潜在的な問題が修正されることがあります。 プールで開始タスクを使用している場合や、ジョブでジョブ準備タスクを使用している場合、それらはノードの再起動時に実行されます。

ノードの再イメージ化

ノードの再イメージ化では、オペレーティング システムが再インストールされます。 再イメージ化の発生後、開始タスクとジョブ準備タスクが再実行されます。

プールからのノードの削除

プールからノードを削除する必要がある場合があります。

ノードでタスク スケジュールを無効にする

ノードでタスク スケジュールを無効にすると、実質的にノードがオフラインになります。 Batch でノードにそれ以上のタスクが割り当てられなくなります。 ただし、ノードはプール内で引き続き実行されます。 その後、失敗したタスクのデータを失うことなく、エラーをさらに詳しく調査できます。 ノードでは、追加のタスク エラーが発生することもありません。

例えば、ノードでタスク スケジュールを無効にします。 次に、リモートでノードにサインインします。 イベントログを確認し、その他のトラブルシューティングを行います。 問題を解決したら、タスクスケジュールを再度有効にして、ノードをオンラインに戻します。

これらのアクションを使用して、現在ノードで実行されているバッチ ハンドル タスクを指定できます。 たとえば、Batch .NET API を使用してタスクのスケジュールを無効にすると、 DisableComputeNodeSchedulingOption の列挙値を指定できます。 次の選択ができます。

  • 実行中のタスクを終了する: Terminate
  • 他のノードでのスケジュール設定のためにタスクをキューを戻す Requeue
  • アクションを実行する前に、実行中のタスクを完了できるようにする TaskCompletion

エラー後の再試行

Batch API により、失敗が通知されます。 組み込みのグローバル再試行ハンドラーを使用して、すべての API を再試行することができます。 この方法がベストプラクティスであり、使用することをお勧めします。

エラーの発生後、数秒待ってから再試行してください。 再試行の回数が多すぎる場合、または再試行が早すぎる場合は、再試行ハンドラーで要求が調整されます。

次の手順