Skip to content

Issue BH: [Infra] 성능 U5 — 유휴에도 분당 505 쿼리, 배포·클라우드 워커에 행별 예외 격리 누락(버그) #340

Description

@Danto7632

스케줄러·워커 감사 결과. 버그 1건(5-2)이 포함되어 있다.

확정 사실

유휴(사용자 0명·작업 0건) 상태에서 ≈505 쿼리/분:

  • 1초 폴링 워커 4종이 각각 2 SELECT·2 tx → 8 tx/s = 480/분
    AgentRunWorker.java:58 · DeploymentRunWorker.java:22 · CloudConnectionVerificationWorker.java:22 · WebhookDeliveryWorker.java:22
  • 15~60초 폴러·스윕 14종 ≈ 25/분
# 위치 문제
5-1 1초 워커 4종 일이 없어도 매초 recover SELECT + claim SELECT
5-2 DeploymentRunWorker · CloudConnectionVerificationWorkerexecuteQueued 버그: 행별 try/catch 가 없다. TaskRejectedException(실행기 포화) 하나가 루프를 끊어, 같은 배치에서 이미 claim 된 2번째 행이 IN_PROGRESS 인 채 리스 만료(2분)까지 방치된다. #55 에서 AgentRunWorker 만 고쳐진 형태가 그대로 남았다
5-3 WebhookDeliveryWorker.processDelivery 스케줄러 스레드에서 동기 처리 — 핸들러가 GitHub 을 호출한다
5-4 StuckDeploymentRecoveryWorker.java:47,76 멈춘 배포 1건당 매분 GitHub 호출, abandon(120분)까지 최대 120회. runId 가 없으면 per_page=30 목록 조회
5-5 DomainVerificationWorker.java:42, 92-95 배치 20건 × (Cloudflare + GitHub + HTTPS 프로브)를 스케줄러 스레드에서 직렬. 커스텀 도메인은 60초 고정 × 1440분 = 건당 최대 1,440회
5-7 StuckApprovalSweeper.java:30 60초 — 자바독이 "정상이면 항상 0건" 이라고 적은 회귀망
5-8 DeploymentRunWorker.renewLeases:31 레지스트리가 비어도 0행 매칭 UPDATE 를 무조건 실행(AgentRunWorker 는 skip 한다)
5-9 ChatTrashCleanupScheduler.java:16 엔티티 전체 로드 후 deleteById N회
5-10 DockerGarbageSweeper.java:49 prune 3회가 스케줄러 스레드 점유

할 일

  • 5-2 먼저 — 행별 try/catch + releaseClaim(AgentRunWorker 패턴 복제)
  • 1초 워커 4종: recover 를 claim 쿼리에 접어 1쿼리로 + 적응형 백오프(일 있으면 1s, 없으면 ×2, 상한 30s). 공통 베이스 클래스로 묶는다
  • WebhookDeliveryWorker 처리를 전용 executor 로 위임
  • StuckDeploymentRecoveryWorker 조회 실패 횟수 지수 백오프(1→2→5→10분)
  • DomainVerificationWorker executor 위임 + 생성 후 경과시간별 간격(10분까지 1분 → 1시간 이후 10분)
  • StuckApprovalSweeper 5분, renewLeases skip, ChatTrashCleanupScheduler 벌크 delete, DockerGarbageSweeper 비동기

의존: #335(U0)의 spring.task.scheduling.pool.size 가 먼저 들어가야 위임 효과가 온전하다.
주의: 워커의 claim 은 행 단위 조건부 UPDATE 로 다중 인스턴스 안전이 이미 확보돼 있다 — 이 성질을 깨지 말 것.

기대

유휴 505/분 → 30/분 이하. 태스크 투입 시 첫 claim 지연은 1초 이내 유지.

계획 원문: .agent-team/00-plan/perf-cost-plan.md U5

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions