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_object | boolean | true | Top 오브젝트의 정보 수집 여부를 설정합니다. 기본값은 true입니다. |
pg_object_hour | int | 5 | Top 오브젝트의 정보를 수집 시각을 설정합니다. 기본값은 5이며 새벽 5시에 수집을 시작합니다. |
데이터 수집 소스
Vacuum 분석 화면의 데이터는 PostgreSQL 시스템 카탈로그와 통계 뷰에서 수집됩니다.
| 섹션 | 주요 소스 | 비고 |
|---|---|---|
| Dead Tuples | pg_class, pg_namespace | pg_stat_get_live_tuples(), pg_stat_get_dead_tuples() 함수로 Tuple 수를 조회합니다. |
| Top Bloat Size | pg_class, pg_stats, pg_stat_user_tables | 컬럼 통계(null_frac, avg_width)를 기반으로 Bloat 크기를 추정 계산합니다. |
| Transaction Age | pg_catalog.pg_database, pg_catalog.pg_settings | age(datfrozenxid)로 데이터베이스별 Transaction Age를 계산하고, autovacuum_freeze_max_age 설정과 비교합니다. |
| Vacuum Execution History | pg_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 Tuples | Warning ≥ | 경고 수준의 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 작업의 상세 내역을 확인할 수 있습니다.
| 컬럼 | 설명 |
|---|---|
Time | Vacuum/Analyze 실행 시각 |
Database | 대상 데이터베이스명 |
Phase | Vacuum 실행 단계 (예: scanning heap, vacuuming indexes 등) |
PID | Vacuum을 수행한 프로세스 ID |
Query | 실행된 Vacuum/Analyze 쿼리 |
Heap Scanned | 스캔한 Heap 블록 수 |
Heap Total | 전체 Heap 블록 수 |
Heap Vacuumed | Vacuum 처리한 Heap 블록 수 |
Index Vacuum | 인덱스 Vacuum 실행 횟수 |
Max Dead Tuples | 한 번에 처리할 수 있는 최대 Dead Tuple 수 |
Dead Tuples | 발견된 Dead Tuple 수 |
Runtime | Vacuum 수행 시간 |
Scanned % | 전체 Heap 대비 스캔 비율 |
Vacuumed % | 전체 Heap 대비 Vacuum 처리 비율 |
Wait Event | 대기 이벤트 명 |
Wait Event Type | 대기 이벤트 유형 |
Configuration
현재 DB 인스턴스에 설정된 Vacuum 관련 파라미터를 참고용으로 표시합니다. PostgreSQL의 다양한 DB 파라미터 중 Vacuum과 관련된 항목만 선별하여 보여주므로, Autovacuum 동작이나 I/O 비용 설정을 별도 DB 접속 없이 바로 확인할 수 있습니다.
AUTOVACUUM SETTINGS
| 파라미터 | 설명 |
|---|---|
autovacuum | Autovacuum 데몬 활성화 여부 |
autovacuum_max_workers | 동시에 실행할 수 있는 Autovacuum 워커 프로세스의 최대 수 |
autovacuum_naptime | Autovacuum 실행 간격(단위: 초) |
autovacuum_vacuum_threshold | Vacuum을 트리거하기 위한 최소 Dead Tuple 수 |
autovacuum_vacuum_scale_factor | Vacuum 트리거 시 테이블 크기 대비 Dead Tuple 비율 |
autovacuum_vacuum_cost_delay | Autovacuum의 I/O 비용 지연 시간(단위: 밀리초) |
autovacuum_vacuum_cost_limit | Autovacuum이 일시 중지되기 전까지 누적할 수 있는 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 Age | 5% 이하 | 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이 필요한 테이블 식별 후 원인 분석 시에는 두 화면을 함께 활용하면 효과적입니다.
-
Vacuum 분석의 Dead Tuple Top 5에서 관리가 필요한 테이블을 식별합니다.
-
Top 오브젝트의 DML 탭에서 해당 테이블의 UPDATE/DELETE 패턴을 확인합니다.
-
Top 오브젝트의 Analyze Time 탭에서 마지막 Vacuum/Analyze 실행 시각을 확인합니다.
-
Vacuum 분석의 Vacuum Execution History에서 Vacuum 실행 이력과 패턴을 확인합니다.
실전 활용 시나리오
시나리오 1. Dead Tuple 누적 원인 파악
-
Vacuum Health Summary에서 Dead Tuple 수가 높은 데이터베이스 확인
-
Dead Tuple Top 5에서 어떤 테이블에 Dead Tuple이 집중되어 있는지 확인
-
Vacuum Execution History에서 해당 시간대에 Vacuum이 실행되었는지 확인
-
Vacuum이 실행되었는데도 Dead Tuple이 줄지 않으면 → 장시간 유지되는 트랜잭션이 Vacuum 을 차단하고 있을 수 있음
시나리오 2. 테이블 Bloat 관리
-
Bloat Size Top 5에서 Bloat가 큰 테이블 확인
-
해당 테이블의 실제 데이터 크기와 비교하여 Bloat 비율 산정
-
Bloat 비율이 높으면 → 서비스 영향을 고려하여
VACUUM FULL또는pg_repack으로 공간 회수 -
주기적으로 Bloat가 재발하면 → Autovacuum 설정 최적화 검토
시나리오 3. Transaction ID Wraparound 예방
-
Transaction Age 카드에서 비율(%) 확인
-
비율이 50%를 넘으면 주의, 80%를 넘으면 즉시 조치
-
pg_stat_activity에서 오래된 트랜잭션 확인 → 불필요한 장기 트랜잭션 종료 -
필요 시 수동으로
VACUUM FREEZE실행