ES /docs

QMAws::startTask | ECS failures - job_id: 1254229, task_definition: cupix-pix-genie-preprocessor-age

Fix Plan: QMAws::startTask | ECS failures (RESOURCE:GPU)

RCA 의 "단기 개선 (1주 이내)" 섹션만 구현한다. 즉시 조치(로그 심각도 조정)와 장기 개선(ECS capacity provider 이전)은 범위에서 제외한다.

Changes#

cupixworks: applications/agents/packages/cupix-tesla-compute-agent/src/model/qmAws.ts#

  • What: runTask 의 인스턴스 선별 루프(develop 기준 qmAws.ts:145-169)에 GPU 잔여량 확인을 추가한다. containerInstance.remainingResources 에서 name === 'GPU' 인 accelerator 리소스를 조회한다. ECS 는 GPU 를 type: 'STRINGSET' 리소스로 보고하며 잔여 GPU 는 stringSetValue 배열의 길이로 표현된다. 인스턴스가 GPU 를 등록(register)했지만 remainingResources 의 GPU 항목이 비어있으면(= 잔여 GPU 0) 해당 인스턴스를 startTask 후보에서 건너뛴다(continue). GPU 를 아예 등록하지 않은 non-GPU 인스턴스는 기존 동작(MEMORY/CPU/idle 조건만 검사)을 그대로 유지한다.
  • Why: root cause 는 선별 루프가 MEMORY/CPU/runningTasksCount==0 && pendingTasksCount==0 만 검사하고 GPU 잔여량을 무시하는 것이다. 그 결과 running_tasks:0 로 idle 로 보이지만 GPU 가 이미 예약된 인스턴스를 골라 ecs.startTask 를 호출하고 ECS 가 failures:[{reason:"RESOURCE:GPU"}] 로 거부한다. GPU 사전 필터를 넣으면 saturated 인스턴스에 대한 startTask 호출 자체가 줄어 RESOURCE:GPU 거부 빈도가 감소한다. 이는 RCA "단기 개선" 의 첫 번째 항목을 직접 구현한다. (RCA 두 번째 항목 — 같은 사이클 내 거부 인스턴스 재선택 방지 — 은 for-loop 이 사이클당 각 인스턴스를 1회만 방문하므로 별도 스킵셋이 불필요하며, GPU 사전 필터가 동일 목적을 달성한다.)
  • Lines: 약 145-169 (선별 루프 내 GPU 리소스 조회 및 skip 분기 추가). 로그 라인에 available GPU 를 함께 남겨 관측성을 높인다.

Acceptance Criteria#

  • 선별 루프가 remainingResources 에서 name === 'GPU' 리소스를 조회한다 (grep -n "'GPU'" qmAws.ts 결과 1건 이상).
  • GPU 를 등록했으나 잔여 GPU 가 0 인 인스턴스는 startTask 를 호출하지 않고 continue 로 건너뛴다.
  • GPU 를 등록하지 않은 인스턴스(non-GPU)는 기존과 동일하게 처리된다 (회귀 없음).
  • remainingResourcesundefined 이거나 GPU 리소스가 없을 때 예외 없이 안전하게 통과한다 (optional chaining).
  • startTaskdata.failures 로깅/재시도(SQS visibility timeout) 경로는 변경하지 않는다 (RCA: eventual consistency 경합이 남으므로 재시도 로직 유지).
  • eslint 통과, TypeScript 컴파일 오류 없음.

Tests#

  • 기존 테스트: cupix-tesla-compute-agent 패키지의 기존 유닛 테스트 (있는 경우) 통과.
  • 신규 테스트: qmAws 선별 루프에 대한 유닛 테스트가 존재하면 GPU 잔여 0 인스턴스 skip 케이스를 추가한다. 테스트 하네스가 없으면 lint + 타입 체크로 검증하고 신규 테스트는 생략한다.