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 없이 공간 회수가 가능합니다.