스케줄러·워커 감사 결과. 버그 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 · CloudConnectionVerificationWorker 의 executeQueued |
버그: 행별 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회가 스케줄러 스레드 점유 |
할 일
의존: #335(U0)의 spring.task.scheduling.pool.size 가 먼저 들어가야 위임 효과가 온전하다.
주의: 워커의 claim 은 행 단위 조건부 UPDATE 로 다중 인스턴스 안전이 이미 확보돼 있다 — 이 성질을 깨지 말 것.
기대
유휴 505/분 → 30/분 이하. 태스크 투입 시 첫 claim 지연은 1초 이내 유지.
계획 원문: .agent-team/00-plan/perf-cost-plan.md U5
스케줄러·워커 감사 결과. 버그 1건(5-2)이 포함되어 있다.
확정 사실
유휴(사용자 0명·작업 0건) 상태에서 ≈505 쿼리/분:
AgentRunWorker.java:58·DeploymentRunWorker.java:22·CloudConnectionVerificationWorker.java:22·WebhookDeliveryWorker.java:22DeploymentRunWorker·CloudConnectionVerificationWorker의executeQueuedTaskRejectedException(실행기 포화) 하나가 루프를 끊어, 같은 배치에서 이미 claim 된 2번째 행이 IN_PROGRESS 인 채 리스 만료(2분)까지 방치된다. #55 에서AgentRunWorker만 고쳐진 형태가 그대로 남았다WebhookDeliveryWorker.processDeliveryStuckDeploymentRecoveryWorker.java:47,76per_page=30목록 조회DomainVerificationWorker.java:42, 92-95StuckApprovalSweeper.java:30DeploymentRunWorker.renewLeases:31AgentRunWorker는 skip 한다)ChatTrashCleanupScheduler.java:16deleteByIdN회DockerGarbageSweeper.java:49할 일
releaseClaim(AgentRunWorker패턴 복제)WebhookDeliveryWorker처리를 전용 executor 로 위임StuckDeploymentRecoveryWorker조회 실패 횟수 지수 백오프(1→2→5→10분)DomainVerificationWorkerexecutor 위임 + 생성 후 경과시간별 간격(10분까지 1분 → 1시간 이후 10분)StuckApprovalSweeper5분,renewLeasesskip,ChatTrashCleanupScheduler벌크 delete,DockerGarbageSweeper비동기의존: #335(U0)의
spring.task.scheduling.pool.size가 먼저 들어가야 위임 효과가 온전하다.주의: 워커의 claim 은 행 단위 조건부 UPDATE 로 다중 인스턴스 안전이 이미 확보돼 있다 — 이 성질을 깨지 말 것.
기대
유휴 505/분 → 30/분 이하. 태스크 투입 시 첫 claim 지연은 1초 이내 유지.
계획 원문:
.agent-team/00-plan/perf-cost-plan.mdU5