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_object | boolean | true | Top 오브젝트의 정보 수집 여부를 설정합니다. 정보를 수집하려면 true로 변경하세요. |
pg_object_hour | int | 5 | Top 오브젝트의 정보를 수집 시각을 설정합니다. 기본값은 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 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 관련 파라미터를 참고용으로 표시합니다. 현재 인스턴스에 설정된 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 설정 점검
실전 활용 시나리오
시나리오 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실행
시나리오 4. Autovacuum 설정 최적화
-
Configuration 섹션에서 현재 Autovacuum 설정 확인
-
Dead Tuple이 자주 누적되면 →
autovacuum_vacuum_scale_factor를 낮추고,autovacuum_vacuum_threshold를 줄여 더 자주 Vacuum 실행 -
Vacuum이 I/O 부하를 유발하면 →
autovacuum_vacuum_cost_delay를 늘려 Vacuum 속도를 조절 -
대규모 테이블이 많으면 →
autovacuum_max_workers를 늘려 병렬 처리