Azure Batch의 오류 처리 및 검색

때때로 Azure Batch 솔루션에서 태스크 및 애플리케이션 오류를 처리해야 할 수 있습니다. 이 문서에서는 다양한 유형의 Batch 오류와 일반적인 문제를 해결하는 방법을 설명합니다.

오류 코드

Batch에서 볼 수 있는 몇 가지 일반적인 오류 유형은 다음과 같습니다.

  • Batch에 도달하지 못한 요청에 대한 네트워킹 실패 또는 Batch 응답이 시간 안에 클라이언트에 도달하지 못한 경우의 네트워킹 실패
  • 내부 서버 오류. 이러한 오류에는 표준 5xx 상태 코드 HTTP 응답이 있습니다.
  • 제한 관련 오류. 이러한 오류에는 Retry-after 헤더가 있는 429 또는 503 상태 코드 HTTP 응답이 포함됩니다.
  • AlreadyExistsInvalidOperation과 같은 4xx 오류. 이러한 오류는 리소스가 상태 전환에 대한 올바른 상태가 아님을 나타냅니다.

특정 오류 코드에 대한 자세한 내용은 Batch 상태 및 오류 코드를 참조하세요. 이 참조에는 REST API, Batch 서비스 및 작업 태스크 및 일정에 대한 오류 코드가 포함됩니다.

애플리케이션 실패

실행 동안 애플리케이션이 진단 출력을 생성할 수 있습니다. 이 출력을 사용하여 문제를 해결할 수 있습니다. Batch 서비스는 컴퓨팅 노드의 태스크 디렉터리에 있는 stdout.txtstderr.txt 파일에 표준 출력 및 표준 오류 출력을 작성합니다. 자세한 내용은 Batch의 파일 및 디렉터리를 참조하세요.

이러한 출력 파일을 다운로드하려면 Azure Portal 또는 Batch SDK 중 하나를 사용합니다. 예를 들어, Batch .NET 라이브러리에서 ComputeNode.GetNodeFileCloudTask.GetNodeFile을 사용하여 문제 해결을 위해 파일을 검색할 수 있습니다.

태스크 오류

태스크 오류는 몇 가지 범주로 나뉩니다.

전처리 오류

작업 시작에 실패하면 작업에 대해 사전 처리 오류가 설정됩니다. 다음과 같은 경우 사전 처리 오류가 발생할 수 있습니다.

  • 태스크의 리소스 파일이 이동되었습니다.
  • 스토리지 계정을 더 이상 사용할 수 없습니다.
  • 노드에 파일을 성공적으로 복사할 수 없는 또 다른 문제가 발생했습니다.

파일 업로드 오류

태스크에 대해 지정된 파일이 어떤 이유로 업로드에 실패한 경우 해당 태스크에 대해 파일 업로드 오류가 설정됩니다. 다음과 같은 경우 파일 업로드 오류가 발생할 수 있습니다.

  • Azure Storage에 액세스하기 위해 제공되는 SAS(공유 액세스 서명) 토큰이 잘못되었습니다.
  • SAS 토큰은 쓰기 권한을 제공하지 않습니다.
  • 스토리지 계정을 더 이상 사용할 수 없습니다.
  • 노드에서 파일을 성공적으로 복사할 수 없는 또 다른 문제가 발생했습니다.

애플리케이션 오류

태스크의 명령줄에서 지정된 프로세스도 실패할 수 있습니다. 자세한 내용은 태스크 종료 코드를 참조하세요.

애플리케이션 오류의 경우 지정된 횟수까지 자동으로 태스크를 다시 시도하도록 Batch를 구성합니다.

제약 조건 오류

작업 또는 태스크에 대한 최대 실행 기간을 지정하려면 maxWallClockTime 제약 조건을 설정합니다. 이 설정을 사용하여 진행하지 못한 태스크를 종료합니다.

태스크가 최대 시간을 초과하는 경우:

  • 태스크가 완료됨으로 표시됩니다.
  • 종료 코드가 0xC000013A로 설정됩니다.
  • schedulingError 필드가 { category:"ServerError", code="TaskEnded"}로 표시됩니다.

태스크 종료 코드

태스크가 프로세스를 실행하는 경우 Batch는 프로세스의 반환 코드를 사용하여 태스크의 종료 코드 속성을 채웁니다. 프로세스가 0이 아닌 종료 코드를 반환하는 경우 Batch 서비스는 태스크를 실패로 표시합니다.

Batch 서비스는 태스크의 종료 코드를 결정하지 않습니다. 프로세스 자체 또는 프로세스가 실행되는 운영 체제에서 종료 코드를 결정합니다.

태스크 실패 또는 중단

간혹 태스크가 실패하거나 중단될 수 있습니다. 예시:

  • 태스크 애플리케이션 자체가 실패할 수 있습니다.
  • 태스크가 실행 중인 노드가 다시 부팅될 수 있습니다.
  • 크기 조정 작업은 풀에서 노드를 제거할 수 있습니다. 이 작업은 풀의 할당 취소 정책이 태스크가 완료될 때까지 기다리지 않고 노드를 즉시 제거하는 경우에 발생할 수 있습니다.

모든 경우에 Batch는 다른 노드에서의 실행을 위해 태스크를 자동으로 큐에 다시 대기할 수 있습니다.

일시적인 문제로 인해 태스크가 응답을 멈추거나 실행하는 데 너무 오래 걸릴 수도 있습니다. 태스크에 대한 최대 실행 간격을 설정할 수 있습니다. 태스크가 이 간격을 초과하면 Batch 서비스가 태스크 애플리케이션을 중단합니다.

컴퓨팅 노드 연결

컴퓨팅 노드에 원격으로 로그인하여 디버깅 및 문제 해결을 수행할 수 있습니다. Azure Portal을 사용하여 Windows 노드에 RDP(원격 데스크톱 프로토콜) 파일을 다운로드하고 Linux 노드에 SSH(Secure Shell) 연결 정보를 가져옵니다. Batch .NET 또는 Batch Python API를 사용하여 이 정보를 다운로드할 수도 있습니다.

RDP 또는 SSH를 통해 노드에 연결하려면 먼저 해당 노드에서 사용자를 만듭니다. 다음 방법 중 하나를 사용하십시오.

필요한 경우 컴퓨팅 노드에 대한 액세스를 구성하거나 사용하지 않도록 설정합니다.

문제 노드 문제 해결

Batch 클라이언트 애플리케이션 또는 서비스가 실패한 태스크의 메타데이터를 검사하여 문제 노드를 식별할 수 있습니다. 풀의 각 노드에는 고유한 ID가 있습니다. 태스크 메타데이터에는 태스크가 실행되는 노드가 포함됩니다. 문제 노드를 찾은 후 다음 방법을 시도하여 오류를 해결합니다.

노드 다시 부팅

노드를 다시 시작하면 경우에 따라 중단 또는 충돌하는 프로세스와 같은 잠재적 문제가 해결됩니다. 풀에서 시작 태스크를 사용하거나 작업에서 준비 태스크를 사용하는 경우 노드가 다시 시작될 때 실행됩니다.

노드 이미지로 다시 설치

노드를 이미지로 다시 설치하면 운영 체제가 다시 설치됩니다. 이미지 다시 설치가 수행된 후 태스크 및 작업 준비 태스크가 다시 실행됩니다.

풀에서 노드 제거

풀에서 노드를 제거해야 하는 경우도 있습니다.

노드에서 태스크 예약 사용 안 함

노드에서 태스크 예약을 사용하지 않도록 설정하면 노드가 효과적으로 오프라인 상태가 될 수 있습니다. Batch는 노드에 더 이상 태스크를 할당하지 않습니다. 그러나 노드는 풀에서 계속 실행됩니다. 그런 다음, 실패한 태스크의 데이터를 손실하지 않고 오류를 추가로 조사할 수 있습니다. 또한 노드는 더 많은 태스크 실패를 야기하지 않습니다.

예를 들어 노드에서 태스크 예약을 사용하지 않도록 설정합니다. 그런 다음, 원격으로 노드에 로그인합니다. 이벤트 로그를 검사하고 다른 문제 해결을 수행합니다. 문제를 해결한 후 태스크 예약을 다시 사용하도록 설정하여 노드를 다시 온라인 상태로 전환합니다.

이러한 작업을 사용하여 현재 노드에서 실행 중인 Batch 핸들 태스크를 지정할 수 있습니다. 예를 들어 Batch .NET API를 사용하여 태스크 예약을 사용하지 않도록 설정하는 경우 DisableComputeNodeSchedulingOption에 대한 열거형 값을 지정할 수 있습니다. 다음을 선택할 수 있습니다.

  • 실행 중인 태스크 종료: Terminate
  • 다른 노드에서 예약하기 위해 태스크를 큐에 다시 추가: Requeue
  • 작업을 수행하기 전에 실행 중인 태스크가 완료되도록 허용: TaskCompletion

오류 후 다시 시도

Batch API는 오류에 대해 알려 줍니다. 기본 제공 전역 재시도 처리기를 사용하여 모든 API를 다시 시도할 수 있습니다. 이 옵션을 사용하는 것이 좋습니다.

오류가 발생한 후 몇 초 정도 기다렸다가 다시 시도합니다. 너무 자주 또는 너무 빨리 다시 시도하는 경우 다시 시도 처리기가 요청을 제한합니다.

다음 단계