본문으로 건너뛰기

Vacuum 분석

Top 오브젝트에서 제공하는 Bloating, Dead Tuple, Age 등의 정보를 Vacuum 관점에서 시각적으로 재구성한 화면입니다. Summary 카드, Top 5 차트, Vacuum 실행 이력 등을 통해 인스턴스의 Vacuum 상태를 빠르게 파악할 수 있습니다.

  • Vacuum Health Summary에서 인스턴스의 Vacuum 건강 상태를 빠르게 파악할 수 있습니다.

  • Table Analysis에서 Dead Tuple과 Bloat Size 기준으로 관리가 필요한 테이블을 식별합니다.

  • Vacuum Execution History에서 Vacuum 실행 패턴과 이력을 시계열로 확인합니다.

노트

Vacuum이란?

PostgreSQL은 MVCC(Multi-Version Concurrency Control) 방식을 사용합니다. UPDATE나 DELETE 후에 기존 Row가 즉시 삭제되지 않고 Dead Tuple로 남습니다. Vacuum은 Dead Tuple을 정리하여 디스크 공간을 재사용할 수 있도록 하는 유지보수 작업입니다.

Vacuum이 제때 실행되지 않으면 다음과 같은 문제가 발생할 수 있습니다.

  • 테이블 Bloat 증가: 불필요한 공간이 늘어나 디스크 사용량 증가 및 쿼리 성능 저하

  • Transaction ID Wraparound: Transaction Age가 한계에 도달하면 DB가 자동으로 쓰기를 중단하는 안전 장치가 작동

사전 설정

Vacuum 분석 기능을 사용하려면 Top 오브젝트 정보 수집을 위한 권한과 Agent 설정이 필요합니다.

수집 권한 설정

-- 스키마 접근 권한 부여
GRANT USAGE ON SCHEMA {schema_name} TO {DB_User};

-- 기존 테이블 조회 권한 부여
GRANT SELECT ON ALL TABLES IN SCHEMA {schema_name} TO {DB_User};

-- 향후 생성되는 테이블에 대한 조회 권한 자동 부여
ALTER DEFAULT PRIVILEGES FOR USER {owner_name} IN SCHEMA {schema_name} GRANT SELECT ON TABLES TO {DB_User};
구문설명
GRANT USAGE ON SCHEMA스키마에 접근할 수 있는 권한을 부여합니다.
GRANT SELECT ON ALL TABLES IN SCHEMA스키마 내 기존 테이블에 대한 조회 권한을 부여합니다.
ALTER DEFAULT PRIVILEGES ... GRANT SELECT향후 해당 스키마에 새로 생성되는 테이블에도 자동으로 조회 권한이 부여됩니다.

Agent 설정

whatap.conf에서 다음 설정을 확인합니다. pg_object의 기본값이 true이므로 별도 설정 없이 수집이 시작됩니다.

pg_object=true
설정 항목타입기본값설명
pg_objectbooleantrueTop 오브젝트의 정보 수집 여부를 설정합니다. 정보를 수집하려면 true로 변경하세요.
pg_object_hourint5Top 오브젝트의 정보를 수집 시각을 설정합니다. 기본값은 5이며 새벽 5시에 수집을 시작합니다.

Vacuum 분석

Vacuum 분석 화면은 인스턴스의 Vacuum 상태와 관리가 필요한 테이블을 다양한 지표와 차트를 통해 확인할 수 있는 대시보드입니다.

기본 옵션

Vacuum 분석 화면에서 조회할 기간과 대상 DB 인스턴스를 선택할 수 있습니다.

  • 시간: 조회할 날짜를 선택합니다.
  • 인스턴스: 조회 대상 DB 인스턴스를 선택합니다.

Vacuum Health Summary

인스턴스의 Vacuum 관련 핵심 지표를 3개의 요약 카드로 제공합니다. Dead Tuples와 Top Bloat Size는 하루에 한 번 수집되며(pg_object_hour 설정 시각 기준), 카드 제목 옆 괄호 안에 수집 시각이 표시됩니다. 하단의 Table Analysis 데이터도 동일한 시각에 수집됩니다.

카드설명
Dead Tuples전체 Dead Tuple 수와 데이터베이스별 분포를 표시합니다.
Top Bloat Size가장 큰 테이블 Bloat 크기(MB)와 데이터베이스별 분포를 표시합니다.
Transaction Age가장 오래된 트랜잭션의 Age와 전체 한계 대비 비율(%)을 표시합니다. 데이터베이스별 비율을 함께 확인할 수 있습니다.

Dead Tuples

Dead Tuple은 UPDATE나 DELETE 후 남은 이전 버전의 Row입니다. 수치가 높으면 Vacuum이 정상적으로 실행되지 않았을 가능성이 있습니다. 데이터베이스명을 클릭하면 하단 Table Analysis의 Dead Tuple Top 5가 해당 데이터베이스로 필터링됩니다.

노트

Dead Tuples가 높을 때

  • VACUUM 테이블명; 실행
  • Dead Tuple은 쿼리 성능 저하와 디스크 사용량 증가의 원인입니다.
  • 설정에서 Autovacuum 활성화여부, 임계값이 너무 높은지 점검하세요.

Top Bloat Size

Bloat는 Dead Tuple 등으로 인해 테이블 크기가 실제 데이터보다 과도하게 커진 상태입니다. Bloat가 크면 불필요한 디스크 공간을 차지하고, 순차 스캔 성능이 저하됩니다. 데이터베이스명을 클릭하면 하단 Table Analysis의 Bloat Size Top 5가 해당 데이터베이스로 필터링됩니다.

노트

Bloat Size가 높을 때

  • VACUUM FULL 테이블명; 실행
  • VACUUM FULL은 테이블 LOCK이 발생하므로, 업무 시간 외 수행을 권장합니다.
  • Bloat가 심하면 쿼리 성능 저하, 인덱스 비효율, 디스크 낭비가 발생합니다.
  • Autovacuum 설정, UPDATE/DELETE 패턴, HOT Update 가능 여부를 함께 점검하세요.
  • pg_repack을 사용하면 테이블 Lock 없이 공간 회수가 가능합니다.

Transaction Age

PostgreSQL의 Transaction ID는 약 20억(2 billion)개를 사용할 수 있습니다. Transaction Age가 이 한계에 근접하면 XID Wraparound가 발생하여 데이터 손상 방지를 위해 DB가 강제 종료될 수 있습니다.

에이전트 버전 v2.59.01 이상이 필요하며, 5초 간격으로 수집됩니다.

노트

Transaction Age가 높을 때

  • VACUUM FREEZE 데이터베이스명; 실행
  • Transaction ID가 20억(2 billion)을 초과하면 XID wraparound가 발생하여 데이터 손상 방지를 위해 DB가 강제 종료될 수 있습니다.
  • 반드시 원인을 파악하여 해결하세요.
    • Long-running Transaction
    • 미처리된 Replication Slot
    • Disabled autovacuum 등

임계값 설정

화면 우측 상단의 임계값 설정 버튼을 클릭하면 Dead Tuples와 Bloat Size에 대한 임계값을 설정할 수 있습니다. 임계값을 설정하면 현재 설정된 값이 상단에 표시되며, 임계값을 초과한 카드는 배경색이 변경되어 이상 상태를 빠르게 인지할 수 있습니다. 설정을 해제하려면 임계값 설정 창에서 설정 해제 버튼을 클릭합니다.

지표설정 항목설명
Dead TuplesWarning ≥경고 수준의 Dead Tuple 수
Critical ≥위험 수준의 Dead Tuple 수
Bloat Size (GB)Warning ≥경고 수준의 Bloat 크기(GB)
Critical ≥위험 수준의 Bloat 크기(GB)
  • Warning 초과 시: 카드 배경이 주황색으로 변경됩니다.

  • Critical 초과 시: 카드 배경이 빨간색으로 변경됩니다.

Table Analysis

테이블 단위로 Vacuum 관련 지표를 분석할 수 있는 Top 5 차트를 제공합니다.

Dead Tuple Top 5

Dead Tuple이 가장 많은 상위 5개 테이블을 수평 막대 차트로 표시합니다. database.schema.table 형식으로 테이블명이 표시됩니다.

  • Dead Tuple이 많은 테이블은 Vacuum이 필요한 상태입니다.

  • 필터 및 테이블 뷰 전환 버튼을 통해 상세 데이터를 확인할 수 있습니다.

Bloat Size Top 5

Bloat Size가 가장 큰 상위 5개 테이블을 수평 막대 차트로 표시합니다. 단위는 바이트입니다.

  • Bloat Size가 큰 테이블은 VACUUM FULL 또는 pg_repack 등으로 공간을 회수하는 것을 검토할 수 있습니다.

  • 필터 및 테이블 뷰 전환 버튼을 통해 상세 데이터를 확인할 수 있습니다.

Vacuum Execution History

선택한 기간 동안의 Vacuum 실행 이력을 시계열 차트로 표시합니다.

  • Vacuum 실행 주기와 특정 시간대의 집중 실행 여부를 확인합니다.

  • Vacuum 실행이 없는 구간이 길다면 Autovacuum 설정을 점검해야 합니다.

Vacuum & Analyze History

차트에서 특정 시간대를 클릭하면 하단에 Vacuum & Analyze History 테이블이 표시되며, 해당 시간대(1시간 단위)에 수행된 Vacuum 및 Analyze 작업의 상세 내역을 확인할 수 있습니다.

컬럼설명
TimeVacuum/Analyze 실행 시각
Database대상 데이터베이스 명
PhaseVacuum 실행 단계 (예: scanning heap, vacuuming indexes 등)
PIDVacuum을 수행한 프로세스 ID
Query실행된 Vacuum/Analyze 쿼리
Heap Scanned스캔한 Heap 블록 수
Heap Total전체 Heap 블록 수
Heap VacuumedVacuum 처리한 Heap 블록 수
Index Vacuum인덱스 Vacuum 실행 횟수
Max Dead Tuples한 번에 처리할 수 있는 최대 Dead Tuple 수
Dead Tuples발견된 Dead Tuple 수
RuntimeVacuum 수행 시간
Scanned %전체 Heap 대비 스캔 비율
Vacuumed %전체 Heap 대비 Vacuum 처리 비율
Wait Event대기 이벤트 명
Wait Event Type대기 이벤트 유형

Configuration

현재 DB 인스턴스에 설정된 Vacuum 관련 파라미터를 참고용으로 표시합니다. 현재 인스턴스에 설정된 Vacuum 관련 파라미터를 표시합니다. Autovacuum 동작과 I/O 비용 설정을 DB 접속 없이 확인할 수 있습니다.

AUTOVACUUM SETTINGS

파라미터설명
autovacuumAutovacuum 데몬 활성화 여부
autovacuum_max_workers동시에 실행할 수 있는 Autovacuum 워커 프로세스의 최대 수
autovacuum_naptimeAutovacuum 실행 간격(단위: 초)
autovacuum_vacuum_thresholdVacuum을 트리거하기 위한 최소 Dead Tuple 수
autovacuum_vacuum_scale_factorVacuum 트리거 시 테이블 크기 대비 Dead Tuple 비율
autovacuum_vacuum_cost_delayAutovacuum의 I/O 비용 지연 시간(단위: 밀리초)
autovacuum_vacuum_cost_limitAutovacuum이 일시 중지되기 전까지 누적할 수 있는 I/O 비용 한도

Autovacuum은 autovacuum_vacuum_threshold + autovacuum_vacuum_scale_factor × 테이블 Row 수만큼의 Dead Tuple이 발생하면 해당 테이블에 대해 Vacuum을 실행합니다.

I/O IMPACT SETTINGS

파라미터설명
vacuum_cost_page_hit공유 버퍼에서 페이지를 찾았을 때의 비용
vacuum_cost_page_miss디스크에서 페이지를 읽어야 할 때의 비용
vacuum_cost_page_dirty페이지를 수정(dirty)할 때의 비용

데이터 해석 가이드

주요 지표

지표정상주의위험
Dead Tuples테이블 대비 소량지속적으로 증가 추세대량 누적, Vacuum 미실행
Bloat Size테이블 크기의 20% 이하테이블 크기의 20~50%테이블 크기의 50% 초과
Transaction Age5% 이하50% 이상80% 이상 → 즉시 조치

조치가 필요한 상황

  • Dead Tuple이 지속적으로 증가

    Autovacuum이 워크로드를 따라가지 못하고 있음 → autovacuum_vacuum_scale_factor 낮추기, autovacuum_max_workers 늘리기

  • Bloat Size가 큰 테이블

    일반 Vacuum으로는 공간이 OS에 반환되지 않음 → VACUUM FULL 또는 pg_repack 검토 (주의: VACUUM FULL은 테이블 잠금 발생)

  • Transaction Age 비율이 높음

    Vacuum이 오래된 트랜잭션을 정리하지 못하고 있음 → 장시간 유지되는 트랜잭션 확인, 수동 VACUUM FREEZE 실행 검토

  • Vacuum Execution History에 빈 구간

    Autovacuum이 비활성화되었거나, 워커가 부족하여 실행되지 못하고 있음 → Autovacuum 설정 점검

실전 활용 시나리오

시나리오 1. Dead Tuple 누적 원인 파악

  1. Vacuum Health Summary에서 Dead Tuple 수가 높은 데이터베이스 확인

  2. Dead Tuple Top 5에서 어떤 테이블에 Dead Tuple이 집중되어 있는지 확인

  3. Vacuum Execution History에서 해당 시간대에 Vacuum이 실행되었는지 확인

  4. Vacuum이 실행되었는데도 Dead Tuple이 줄지 않으면 → 장시간 유지되는 트랜잭션이 Vacuum을 차단하고 있을 수 있음

시나리오 2. 테이블 Bloat 관리

  1. Bloat Size Top 5에서 Bloat가 큰 테이블 확인

  2. 해당 테이블의 실제 데이터 크기와 비교하여 Bloat 비율 산정

  3. Bloat 비율이 높으면 → 서비스 영향을 고려하여 VACUUM FULL 또는 pg_repack으로 공간 회수

  4. 주기적으로 Bloat가 재발하면 → Autovacuum 설정 최적화 검토

시나리오 3. Transaction ID Wraparound 예방

  1. Transaction Age 카드에서 비율(%) 확인

  2. 비율이 50%를 넘으면 주의, 80%를 넘으면 즉시 조치

  3. pg_stat_activity에서 오래된 트랜잭션 확인 → 불필요한 장기 트랜잭션 종료

  4. 필요 시 수동으로 VACUUM FREEZE 실행

시나리오 4. Autovacuum 설정 최적화

  1. Configuration 섹션에서 현재 Autovacuum 설정 확인

  2. Dead Tuple이 자주 누적되면 → autovacuum_vacuum_scale_factor를 낮추고, autovacuum_vacuum_threshold를 줄여 더 자주 Vacuum 실행

  3. Vacuum이 I/O 부하를 유발하면 → autovacuum_vacuum_cost_delay를 늘려 Vacuum 속도를 조절

  4. 대규모 테이블이 많으면 → autovacuum_max_workers를 늘려 병렬 처리