Postgresql

Vaccum

dbavayne 2025. 1. 11. 14:43

 

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%';

 

 

 

참고

https://techblog.woowahan.com/9478/

'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