postgresql 에서 vacuum 이 왜 필요한지는 앞선 글에서 정리했다.
[ PostgreSQL ] 1. vacuum ( vacuum 이 필요한 이유)
운영환경에서 vacuum 은 사용자가 일일이 실행하는것은 무리가 있고, autovacuum 을 사용하여
설정된 조건을 만족하면 자동 트리거되어 vacuum 이 동작하게 된다.
autovacuum 은 vacuum 과 다르게 공유락 사용으로 운영중에도 사용가능하고, 리밋과 설정값 제한으로 리스크가 적다.
1. 주요 autovacuum 관련 설정값
- autovacuum_enabled (boolean)
: autovacuum 동작 여부를 켜거나 끈다.
=> ALTER TABLE mytable SET (autovacuum_enabled = false);
- autovacuum_vacuum_threshold (integer)
: autovacuum이 실행되는 최소 dead tuple(불필요 데이터) 개수 기본값은 50개.
이 숫자를 늘리면 autovacuum 동작 빈도를 줄일 수 있지만, dead tuple 증가 위험도 존재.
- autovacuum_vacuum_scale_factor (float)
: 테이블 크기의 몇 %가 변경될 때 autovacuum 동작하는 비율.
기본값은 0.2 (20%). 예를 들어 10만 행 테이블에서 2만 행 변경 시 autovacuum 동작.
0으로 설정하면 threshold 수치만으로 판단하여 더 일관된 실행 가능.
- autovacuum_analyze_threshold (integer)
: autovacuum이 통계수집을 수행하기 위해 수정되어야 하는 최소 레코드 수. 기본 50개.
- autovacuum_analyze_scale_factor (float)
: 테이블 크기의 몇 % 변경 시 autovacuum ANALYZE를 수행하는지 비율. 기본값 0.1 (10%).
- autovacuum_freeze_min_age (integer)
: XID freeze를 시도하는 최소 트랜잭션 나이(초기값 50만).
- autovacuum_freeze_max_age (integer)
: XID wraparound 방지를 위해 반드시 vacuum과 freeze가 필요한 최대 트랜잭션 나이 기본값 약 2억.
- autovacuum_vacuum_cost_delay (integer, ms)
: autovacuum 작업 중 I/O 작업 간 대기 시간. 0으로 줄이면 빠르지만 부하 증가 가능.
기본값 20ms 정도.
- autovacuum_vacuum_cost_limit (integer)
: 한 번의 autovacuum 작업이 소진할 수 있는 "비용 크레딧(credit)"의 최대값을 지정
기본값은 -1이며, 이 경우 일반 vacuum_cost_limit 값(보통 200)이 사용된다.
페이지를 vacuum 처리할 때마다 페이지 유형에 따라 크레딧을 소모된다.
ex) shared buffer 내 데이터를 vacuum할 때 1 크레딧, 디스크에서 읽을 때 2 크레딧, 죽은 튜플이 있는 dirty 페이지는 20 크레딧 등
크레딧이 모두 소진되면 autovacuum 프로세스는 멈추거나 잠시 대기(vacuum_cost_delay)한다.
비용 크레딧 제한이 낮으면 vacuum 작업이 자주 중단되어 dead tuple 누적 가능성이 커진다.
너무 높으면 autovacuum이 시스템 자원을 과도히 점유해 다른 쿼리에 영향을 줄 수 있다.
이 외에도 다음 설정들이 있는데, 이들은 보통 전역 설정이며 개별 테이블 설정은 지원하지 않습니다.
- vacuum_cost_page_hit, vacuum_cost_page_miss, vacuum_cost_page_dirty (vacuum 비용 산정 관련)
2. autovacuum 설정 변경 예시
ALTER TABLE my_big_table SET (
autovacuum_enabled = true,
autovacuum_vacuum_threshold = 5000, -- 기본 50
autovacuum_vacuum_scale_factor = 0.05, -- 기본 0.2
autovacuum_analyze_threshold = 1000, -- 기본 50
autovacuum_analyze_scale_factor = 0.02, -- 기본 0.1
autovacuum_vacuum_cost_delay = 10, -- 기본 20
autovacuum_vacuum_cost_limit = 1000 -- 기본 -1 => 200
);
3. 테이블의 autovacuum 설정 확인
select c.relname AS table_name,
option_name,
option_value
FROM pg_class c
LEFT JOIN LATERAL pg_options_to_table(c.reloptions) AS opts(option_name, option_value)
ON true
WHERE c.relkind = 'r' -- 일반 테이블만
* psql 로 확인하기
\d+ your_table_name
postgres=> \d+ t_repk
Table "public.t_repk"
Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description
--------+---------+-----------+----------+------------------------------------+----------+-------------+--------------+-------------
id | integer | | not null | nextval('t_repk_id_seq'::regclass) | plain | | | data | text | | | | extended | | | Indexes:
"t_repk_pkey" PRIMARY KEY, btree (id)
Access method: heap
Options: autovacuum_vacuum_scale_factor=0.05, autovacuum_vacuum_threshold=1000
'생계 > PostgreSQL' 카테고리의 다른 글
| [ PostgreSQL ] 2. vacuum ( 명령어 별 기능) (1) | 2025.08.02 |
|---|---|
| ec2 서버에 pg_repack 설치하기 (0) | 2025.07.27 |
| [ postgresql ] WAL ( write ahead log ) 관리 (0) | 2025.07.23 |
| [ PostgreSQL ] postgresql 로그 (0) | 2025.07.08 |
| postgresql 튜닝 위한 뷰 및 관련 도구 (0) | 2025.07.08 |