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)는 기존과 동일하게 처리된다 (회귀 없음).
-
remainingResources가undefined이거나 GPU 리소스가 없을 때 예외 없이 안전하게 통과한다 (optional chaining). -
startTask의data.failures로깅/재시도(SQS visibility timeout) 경로는 변경하지 않는다 (RCA: eventual consistency 경합이 남으므로 재시도 로직 유지). - eslint 통과, TypeScript 컴파일 오류 없음.
Tests#
- 기존 테스트:
cupix-tesla-compute-agent패키지의 기존 유닛 테스트 (있는 경우) 통과. - 신규 테스트: qmAws 선별 루프에 대한 유닛 테스트가 존재하면 GPU 잔여 0 인스턴스 skip 케이스를 추가한다. 테스트 하네스가 없으면 lint + 타입 체크로 검증하고 신규 테스트는 생략한다.