
VACUUM은 dead tuple 을 정리하고, 디스크 공간을 확보하며, 테이블 통계 정보를 업데이트합니다.
- 임계치 이상으로 발생한 Dead Tuple을 정리하여 FSM (Free Space Map) 으로 반환
- Transaction ID Wraparound 방지
- 통계정보 갱신
- visibility map을 갱신하여 index scan 성능 향상
Vacuum 종류
PostgreSQL에는 여러 종류의 VACUUM이 있으며, 각각의 목적과 사용 사례가 다릅니다.
VACUUM
- 목적: 데드 튜플을 정리하고, 디스크 공간을 재사용 가능하게 만듭니다.
- 특징: 테이블에 대한 잠금이 적고, 디스크 공간을 운영 체제에 반환하지 않습니다.
VACUUM 테이블명;
VACUUM FULL
- 목적: 데드 튜플을 완전히 제거하고, 디스크 공간을 운영 체제에 반환합니다.
- 특징: 테이블에 대한 배타적 잠금(Exclusive Lock)이 필요하며, 테이블을 재구성합니다. 대용량 테이블에서는 성능에 영향을 줄 수 있습니다.
-
VACUUM FULL 테이블명;
AUTOVACUUM
- 목적: PostgreSQL의 자동 VACUUM 프로세스로, 데드 튜플이 일정 수준 이상 쌓이면 자동으로 VACUUM을 실행합니다.
- 특징: 기본적으로 활성화되어 있으며, 수동 VACUUM보다 더 효율적으로 관리할 수 있습니다.
vaccum 모니터링 지표
VACUUM의 상태와 효율성을 모니터링하기 위해 다음 지표들을 확인
데드 튜플 비율
- 지표: n_dead_tup (pg_stat_all_tables)
- 설명: 테이블에 있는 데드 튜플의 수입니다. 이 값이 높으면 VACUUM이 필요함을 나타냅니다.
- 쿼리:
SELECT relname, n_live_tup, n_dead_tup FROM pg_stat_all_tables WHERE schemaname = 'public';
Autovacuum 활동
- 지표: autovacuum_count, last_autovacuum (pg_stat_all_tables)
- 설명: Autovacuum이 얼마나 자주 실행되었는지, 마지막으로 실행된 시간을 확인합니다.
- 쿼리:
SELECT relname, last_autovacuum, autovacuum_count FROM pg_stat_all_tables WHERE schemaname = 'public';
테이블 블로트(Bloat)
- 지표: 테이블과 인덱스의 실제 사용 공간 대비 낭비된 공간의 비율.
- 설명: 블로트가 심한 테이블은 VACUUM FULL이나 REINDEX가 필요할 수 있습니다.
- 쿼리:
SELECT schemaname, tablename, pg_size_pretty(pg_total_relation_size(schemaname || '.' || tablename)) AS total_size, pg_size_pretty(pg_table_size(schemaname || '.' || tablename)) AS table_size, pg_size_pretty(pg_indexes_size(schemaname || '.' || tablename)) AS index_size FROM pg_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema') ORDER BY pg_total_relation_size(schemaname || '.' || tablename) DESC;
VACUUM 지연 시간
- 지표: vacuum_cost_delay
- 설명: VACUUM 작업이 다른 작업에 미치는 영향을 줄이기 위해 지연 시간을 설정합니다. 기본값은 0입니다.
- 확인 방법:
SHOW vacuum_cost_delay;
VACUUM 비용 한도
- 지표: vacuum_cost_limit
- 설명: VACUUM 작업이 한 번에 수행할 수 있는 작업량을 제한합니다. 기본값은 200입니다.
- 확인 방법:
SHOW vacuum_cost_limit;
vaccum 관련 문제
1. VACUUM이 느린 경우
- 원인: 대용량 테이블, 높은 vacuum_cost_delay, I/O 병목 현상 등.
- 해결 방법:
- vacuum_cost_delay를 줄입니다.
- maintenance_work_mem을 증가시켜 VACUUM 작업에 더 많은 메모리를 할당합니다.
2. Autovacuum이 자주 실행되는 경우
- 원인: autovacuum_vacuum_threshold 또는 autovacuum_vacuum_scale_factor가 너무 낮게 설정됨.
- 해결 방법:
- 테이블별로 임계값을 조정
3. 디스크 공간이 부족한 경우
- 원인: VACUUM FULL을 사용하지 않아 데드 튜플이 완전히 제거되지 않음.
- 해결 방법:
- 주기적으로 VACUUM FULL을 실행합니다.
- 테이블 블로트를 확인하고 재구성합니다.
Query
vacuum 상태, 진행상황 확인
--pg_stat_activity: 현재 실행 중인 VACUUM 작업을 확인할 수 있습니다.
SELECT * FROM pg_stat_activity WHERE query LIKE '%VACUUM%';
--pg_stat_progress_vacuum: VACUUM 작업의 진행 상황을 실시간으로 확인할 수 있습니다.
SELECT
pid,
phase, --현재 VACUUM 단계(예: scanning heap, vacuuming indexes).
heap_blks_total, --전체 블록 수.
heap_blks_scanned --스캔 완료된 블록 수.
FROM
pg_stat_progress_vacuum;
autovaccum 확인
-- Autovacuum과 관련된 통계 정보
SELECT
schemaname,
relname,
last_autovacuum, --마지막 Autovacuum 실행 시간.
autovacuum_count, --Autovacuum이 실행된 횟수.
n_live_tup, --현재 라이브 튜플의 수.
n_dead_tup --현재 데드 튜플의 수.
FROM
pg_stat_all_tables
WHERE
schemaname NOT IN ('pg_catalog', 'information_schema');
-- 현재 실행 중인 Autovacuum 프로세스를 확인
SELECT
pid,
query, --실행 중인 쿼리 또는 작업.
state --프로세스의 현재 상태.
FROM
pg_stat_activity
WHERE
query LIKE '%autovacuum%';
참고
'Postgresql' 카테고리의 다른 글
pgadmin4 (0) | 2025.01.11 |
---|---|
슬로우쿼리 모니터링 (0) | 2024.12.26 |
Visibility Map(가시성 맵) (0) | 2024.12.17 |
쿼리성능 분석 툴 pg_stat_statements (0) | 2024.12.17 |
PostgreSQL 15.8 시스템 변수 최적화 (0) | 2024.12.11 |