피드로 돌아가기
Postgres 큐를 건강하게 유지하기
GeekNewsGeekNews
Database

Postgres 큐를 건강하게 유지하기

MVCC Horizon 고정 해결을 통한 Postgres 큐 Bloat 제거 및 안정성 확보

neo2026년 4월 18일11advanced

Context

Postgres 기반 Job Queue 운영 시 빈번한 삽입-삭제로 인한 Dead Tuple 누적이 Table Bloat와 성능 저하를 유발함. 특히 장기 실행 트랜잭션이 MVCC Horizon을 고정하여 Autovacuum의 정리를 차단함으로써 시스템이 서서히 열화되는 Death Spiral 현상이 발생함.

Technical Solution

  • FOR UPDATE SKIP LOCKED 도입을 통한 워커 간 Lock 경쟁 최소화 및 큐 처리 효율 개선
  • 트랜잭션당 처리 건수를 늘리는 Batch Processing 적용으로 인덱스 스캔 비용 분산
  • SQLCommenter 태그 기반의 쿼리 클래스 분류를 통한 워크로드 식별 체계 구축
  • Traffic Control의 Resource Budget을 활용하여 분석 쿼리의 Maximum Concurrent Workers를 제한
  • 저우선순위 쿼리의 동시 실행 수를 강제 제어하여 Autovacuum이 Dead Tuple을 정리할 수 있는 시간적 창구 확보
  • 차단된 쿼리에 대한 애플리케이션 레벨의 Retry 로직 구현으로 전체 작업 처리량 유지

1. 큐 테이블 설계 시 FOR UPDATE SKIP LOCKED 사용 여부 확인

2. 장기 실행 쿼리가 MVCC Horizon을 고정하여 Autovacuum을 방해하는지 모니터링

3. 단순 statement_timeout 외에 워크로드별 동시 실행 수(Concurrency) 제한 방안 검토

4. 분석 쿼리와 트랜잭션 큐의 리소스 격리 전략 수립

원문 읽기
Postgres 큐를 건강하게 유지하기 | Devpick