본문으로 건너뛰기

Vacuum 분석

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가 자동으로 쓰기를 중단하는 안전 장치가 작동

사전 설정

DB 설정

에이전트가 스키마 정보를 조회할 수 있도록 모니터링 계정에 권한을 부여합니다.

-- 스키마 접근 권한 부여
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 분석 화면의 데이터는 PostgreSQL 시스템 카탈로그와 통계 뷰에서 수집됩니다.

섹션주요 소스비고
Dead Tuplespg_class, pg_namespacepg_stat_get_live_tuples(), pg_stat_get_dead_tuples() 함수로 Tuple 수를 조회합니다.
Top Bloat Sizepg_class, pg_stats, pg_stat_user_tables컬럼 통계(null_frac, avg_width)를 기반으로 Bloat 크기를 추정 계산합니다.
Transaction Agepg_catalog.pg_database, pg_catalog.pg_settingsage(datfrozenxid)로 데이터베이스별 Transaction Age를 계산하고, autovacuum_freeze_max_age 설정과 비교합니다.
Vacuum Execution Historypg_stat_progress_vacuum, pg_stat_activity실행 중인 Vacuum의 진행 상태, 대기 이벤트, 쿼리 정보를 조회합니다.

Vacuum 분석하기

Vacuum 관련 지표를 기반으로 테이블 상태와 유지보수 필요 여부를 분석할 수 있습니다. 주요 지표는 다음과 같습니다.

기본 옵션

상단 필터 영역에서 시간, 대상 인스턴스를 설정할 수 있습니다.

  • 시간: 조회할 날짜를 선택합니다.

  • 인스턴스: 조회 대상 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 수치가 높으면 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 관련 파라미터를 참고용으로 표시합니다. PostgreSQL의 다양한 DB 파라미터 중 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 설정 점검

Top 오브젝트 활용 분석

Vacuum 분석은 Top 오브젝트에서 제공하는 Bloating, Dead Tuple, Age 정보를 Vacuum 관점에서 시각적으로 재구성한 화면입니다. 두 화면은 동일한 데이터(pg_object_hour 시각에 수집)를 기반으로 하되, 분석 목적에 따라 다른 관점을 제공합니다.

비교 항목Vacuum 분석Top 오브젝트
분석 관점Vacuum 유지보수 중심오브젝트(테이블/인덱스) 중심
데이터 범위Bloating, Dead Tuple, Age + Vacuum 실행 이력Bloating, Scan, DML, Analyze Time, Age, Dead Tuple 등 6가지
표현 방식Summary 카드 + Top 5 차트 + 시계열 이력정렬 가능한 테이블 목록(Top N)
고유 기능Vacuum Health Summary, Vacuum 실행 이력, 임계값 알림, DB 파라미터 조회Scan/DML 분석, Object Detail, 인덱스 분석

활용 가이드

  • 전반적인 Vacuum 상태 파악이 목적이라면 → Vacuum 분석 화면에서 Summary 카드와 Top 5 차트로 빠르게 현황을 확인하세요.

  • 특정 테이블의 상세 분석이 필요하다면 → Top 오브젝트 화면에서 다양한 탭과 정렬 기준으로 세밀하게 분석하세요.

  • Vacuum이 필요한 테이블 식별 후 원인 분석 시에는 두 화면을 함께 활용하면 효과적입니다.

  1. Vacuum 분석의 Dead Tuple Top 5에서 관리가 필요한 테이블을 식별합니다.

  2. Top 오브젝트의 DML 탭에서 해당 테이블의 UPDATE/DELETE 패턴을 확인합니다.

  3. Top 오브젝트의 Analyze Time 탭에서 마지막 Vacuum/Analyze 실행 시각을 확인합니다.

  4. Vacuum 분석의 Vacuum Execution History에서 Vacuum 실행 이력과 패턴을 확인합니다.

실전 활용 시나리오

시나리오 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를 늘려 병렬 처리