목록 보기
PostgreSQL Autovacuum과 Lock
백엔드

PostgreSQL Autovacuum과 Lock

넥스트리
넥스트리
2026년 9월 7일

두줄요약

운영 중 PostgreSQL에서 wraparound 방지 autovacuum이 CPU 100%를 유발한 사례를 정리했습니다. xid_age 누적, lock 경합, 긴급 대응과 사전 모니터링 포인트를 함께 설명했습니다.

문제 상황

  • 운영 중 PostgreSQL에서 CPU 100% 상태가 지속되며, 원인이 일반 쿼리가 아닌 wraparound 방지 autovacuum으로 확인됨
  • 트래픽 증가와 백그라운드 정리 지연으로 특정 테이블의 xid_age가 누적되고, 강제 실행된 autovacuum이 문제 테이블을 처리하며 장시간 정체 발생

원인 분석

  • UPDATE/DELETE로 남는 dead tuple과 트랜잭션 ID(xid) 누적이 autovacuum 처리 속도보다 빨라지며 임계값에 도달
  • 일반 autovacuum은 비교적 가벼운 lock이지만, 오래 열린 트랜잭션이나 DDL과 겹치면 정리 지연과 lock 경합이 발생 가능

해결 방법

  • pg_stat_activity로 실행 중 쿼리를 확인해 wraparound 방지 autovacuum 여부를 판단
  • autovacuum_freeze_max_age를 일시 상향해 강제 대상에서 제외시키고, 문제 테이블을 정리한 뒤 설정을 원복

주의할 점

  • wraparound 방지 모드는 프로세스 종료나 autovacuum 비활성화로 멈출 수 없음
  • 오래 열린 트랜잭션은 dead tuple 정리를 막아 bloat와 성능 저하를 유발할 수 있음

적용해볼 점

  • xid_age, dead tuple 비율, autovacuum 상태를 상시 모니터링
  • 배포 시 DDL과 autovacuum의 lock 충돌 가능성을 고려

다음 읽기

#PostgreSQL 주제를 다룬 다른 회사 글

pgstattuple extension을 사용한 PostgreSQL 성능 향상

pgstattuple 확장으로 PostgreSQL 테이블과 인덱스의 팽창, 단편화, 여유 공간을 진단하는 방법을 소개했습니다. VACUUM, pg_repack, REINDEX와 자동화 전략으로 성능을 유지하는 실무 팁을 정리했습니다.

AWS
AWS
백엔드

댓글 0

댓글을 작성하려면 로그인이 필요합니다.

댓글을 불러오는 중...