cb-spider
cb-spider copied to clipboard
[GCP:VM] VM Not Found Error Due to ZONE_RESOURCE_POOL_EXHAUSTED
cc: @seokho-son @yunkon-kim
- 드물게, VM이 생성되지 않는 오류가 발생하고 있습니다. (표면상: VM not found 에러 반복)
[VM 생성시 현황]
- VM 생성시 생성 요청은 성공적으로 반환을 받습니다.
- 관련 코드 위치: https://github.com/cloud-barista/cb-spider/blob/75f73c0ff2a02f28858a6576145ba91cb4df858a/cloud-control-manager/cloud-driver/drivers/gcp/resources/VMHandler.go#L470
- 그런데, 다음 위치의 WaitForRun() 내부에서 VM 상태를 얻는데 없는 VM이라고 나옵니다.
- https://github.com/cloud-barista/cb-spider/blob/75f73c0ff2a02f28858a6576145ba91cb4df858a/cloud-control-manager/cloud-driver/drivers/gcp/resources/VMHandler.go#L492
- 관련 에러 메시지
[CB-SPIDER].[ERROR]: 2024-05-03 16:31:42 VMHandler.go:875, github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/drivers/gcp/resources.(*GCPVMHandler).GetVMStatus() - googleapi: Error 404: The resource 'projects/powerkimhub/zones/us-central1-a/instances/deeplearning-vm-test-coq941jp70ipgggvd61g' was not found, notFound
[분석]
- VM 생성 요청 시점에 GCP Console로 VM 목록을 refresh 해보면,
- 대상 VM이 잠시 나타났다가 사라집니다.
- GCP Console 로그 탐색기로 오류 트레이싱을 해보면, 다음과 같이
-
ZONE_RESOURCE_POOL_EXHAUSTED
오류가 발생했었음을 알수 있습니다. -
-
[제안]
- 현재 Spider 사용자는 이유를 알수 없이 VM 생성이 안되는 현상에 빠지게 됩니다.
- 혹시, 드라이버 차원에서 이와 같은 상황을 인지 할수 있고,
- 사용자에게 상황(ZONE_RESOURCE_POOL_EXHAUSTED)에 맞는 정확한 에러 메시지를 제공할 수 있는 지 등 확인 부탁 드립니다.
참고로, GPU (특히 비싼) 가 포함된 VM을 생성하는 경우, 특정 존에서 가용 GPU가 부족해서, 지속적으로 pending되거나 사용자가 중단시키도록 요청하는 상황이 발생했었습니다. (GCP 콘솔에서 수행)
참고로, GPU (특히 비싼) 가 포함된 VM을 생성하는 경우, 특정 존에서 가용 GPU가 부족해서, 지속적으로 pending되거나 사용자가 중단시키도록 요청하는 상황이 발생했었습니다. (GCP 콘솔에서 수행)
- 그렇군요. 재현시 참고하면 좋을 것 같습니다.
- 다음 링크의 deeplearning VM 생성 스크립트 참고
- https://github.com/cloud-barista/cb-spider/issues/1184#issuecomment-2092581719
안녕하세요. @powerkimhub
동일한 에러 재현을 위해 테스트한 스펙입니다.
- zone : us-central1-a
- vm spec : a2-highgpu-1g
- public image : https://www.googleapis.com/compute/v1/projects/deeplearning-platform-release/global/images/tf-2-15-cu121-v20240417-debian-11
- GCP Cloud logging 을 통해서 comput.instance.insert operation 확인 결과
- 요청 발생 로그 시간과 실제 에러가 발생하는 시간의 차이가 있다는 점을 확인하였습니다.
- 이는 구글에서 해당 리소스로 프로비저닝을 진행하는 중 발생하는 에러일 것이며
- 해당 메시지는 instance insert api 요청이 발생하는 시점의 응답 정보 만으로는 확인이 불가능합니다.
// ...
op, err := vmHandler.Client.Instances.Insert(projectID, zone, instance).Do()
// ...
fmt.Println(op.HTTPStatusCode) // always 0
fmt.Println(op.Error) // always nil
fmt.Println(op.Status) // always "RUNNING"
-
다만 최초 instance insert 요청시 반환되는 operation 내 정보를 이용해 operation api 를 추가적으로 호출 가능합니다.
-
ZoneOperations.Wait()
- 작업 상태가 DONE 혹은 최대 2분 동안 기다린 후 결과 반환
-
ZoneOperations.Get()
- 단일 상태 요청
-
ZoneOperations.Wait()
-
해당 api 를 적절한 방식으로 호출하고, 반환하는 값을 활용해서 operation이 완료된 후 상태와
QUOTA_EXCEEDED
,ZONE_RESOURCE_POOL_EXHAUSTED
등 에러 메시지 확인이 가능해 보입니다.
- Wait() 메서드가 기다리는 목적을 명확히 할 수 있지만 fetch 상태에 중 로그를 남기는 등의 액션을 위해선 별도의 고루틴이 있어야 하기 때문에
- Get() 메서드의 반복 호출 및 적절한 로그 처리로 해당 operation 에 대한 응답을 기다리는 방법이 좋을 것 같습니다.
- 구글 내부적으로 operation 의 DONE 상태 처리까지 얼마나 걸릴지 모르지만
- 테스트 해본 결과 성공과 실패 여부와 상관없이 DONE 처리는 완료되며, RUNNING 에서 DONE 까지 짧게는 수초에서 길게는 1분 정도까지 대기하게 됩니다.
#1125 의 3번 처리 부분이 본 이슈와 관련 있습니다.
(3) 쿼터 또는 자원 부족시 발생할 수 있는 Error Notification 타입 무인식 현재, GCP SDK API가 반환하는 에러로는 에러 발생 상황을 인지하지 못하여, VM 생성이 완료되기를 반복 호출하다가 timeout 에러 처리됨 => Operations 실행(VM 생성 호출) 상태를 polling 하도록 반영함
-
테스트 진행
- zone : us-central1-a
- vm spec : a2-highgpu-1g
- public image : https://www.googleapis.com/compute/v1/projects/deeplearning-platform-release/global/images/tf-2-15-cu121-v20240417-debian-11
-
결과
- 에러 로그와 함께 vm 생성 없이 응답 반환
- not found 에러 로그 없음
- Fixed in #1125