앞서 vacuum에 대해 설명했던 이번엔 autovacuum에 대해 알아볼 예정.
15. PostgreSQL - VACUUM
앞 서 vacuum에서 하는 일 및 내부 처리 과정에 대해 설명https://lsmdd.tistory.com/113 13. PostgreSQL - VACUUM 내부 동작 과정vacuum이 하는 일dead tuple 제거dead tuple을 가리키는 index tuple 제거tuple의 oid txids를 free
lsmdd.tistory.com
autovacuum daemon
PostgreSQL에서 background process로 autovacuum daemon을 제공하여 vacuum 처리를 자동화함.
autovacuum daemon은 주기적으로 여러 개의 autovacuum_workder process를 호출함.
호출빈도 및 process 갯수는 아래 파라미터에 의해 결정됨.
autovacuum_naptime (default 1min)
autovacuum_max_works(default 3개)
autovacuum daemon이 호출한 autovacuum workers는 각 tables에 대해 동시에 vacuum processing을 수행
그리고 database에 영향을 최소화하면서 점진적으로 진행함.
autovacuum 동작 조건
공식문서 참고
https://www.postgresql.org/docs/current/routine-vacuuming.html#AUTOVACUUM
24.1. Routine Vacuuming
24.1. Routine Vacuuming # 24.1.1. Vacuuming Basics 24.1.2. Recovering Disk Space 24.1.3. Updating Planner Statistics 24.1.4. Updating the Visibility Map 24.1.5. …
www.postgresql.org
autovacuum freeze 수행 조건
current_txid > pg_class.relfrozenxid + autovacuum_freeze_max_age(default 2억)
autovacuum dead tuple 정리 수행 조건
dead tuple 수 > autovacuum_vacuum_threshold(50)+ autovacuum_vacuum_scale_factor(0.2) * pg_class.reltuples
예시) dead tuple 수가 공식에 의해 추출된 갯수보다 많으니 dead tuple 정리를 위해 autovacuum 호출
2100 > 50 + 0.2 * 10000 = 2100 > 2000
autovacuum에서 insert tuple 수에 따라 호출
PostgreSQL 13부터 도입되었으며 insert된 tuple 수가 아래 공식에 의해 계산된 값보다 커질 때 autovacuum 호출
autovacuum_vacuum_insert_threshold(1000) + autovacuum_vacuum_insert_scale_factor(0.2) × pg_class.reltuples
autovacuum에서 analyze를 수행하는 조건
마지막으로 analyze를 수행한 시점 이후에 insert , delete, update로 수정된 tuple 수가 계산된 값보다 커질 때 수행됨.
mod_since_analye > autovacuum_analyze_threshold(50) + autovacuum_analyze_scale_factor(0.1) x pg_class.reltuples
autovacuum 관리 tips
PostgreSQL에서 table bloat이 가장 큰 이슈임.
autovacuum 관리를 제대로 못해도 table bloat이 발생할 수 있음.
예를 들어, table에 저장된 tuple의 양에 따라 default로 제공되는 autovacuum 관련 파라미터가 적절하지 않을 수 있음.
dead tuple 정리 시 호출되는 공식만으로 간단하게 적어보면 아래와 같다.
50 + 0.2 * 1000 = 250
50 + 0.2 * 100000 = 20,050
50 + 0.2 * 100,000,000 = 20,000,050
즉, table의 tuple 양에 따라서 autovacuum이 호출되는 빈도가 달라지게 되고 table bloat으로 이어지게 됨.
그래서 테이블마다 autovacuum 관련 파라미터를 조정해서 사용할 필요가 있음.
테이블 별로 설정할 수 있는 방법
#### default 0.2 => 0.05로 해당 테이블만 변경
ALTER TABLE pgbench_accounts SET (autovacuum_vacuum_scale_factor = 0.05);
#### 비율은 사용하지 않고 갯수로만 결정하고 싶을 때 사용
ALTER TABLE pgbench_accounts SET (autovacuum_vacuum_threshold = 10000);
ALTER TABLE pgbench_accounts SET (autovacuum_vacuum_scale_factor = 0.0);
전체 tuple 대비 dead tuple 비율에 따른 문제점.
일반적으로 dead tuple이 전체 tuple 대비 일정 비율 이상이면 bloat이 발생할 가능성이 커집니다.
일반적인 기준
table의 전체 tuple에서 1% 이하의 dead tuple 비율:
VACUUM이 매우 자주 발생하지 않지만, tuple 수에 따라 자주 vacuum이 수행될 수 있음.
table의 전체 tuple에서 5% 이상의 dead tuple 비율:
이 정도 비율이 계속 유지되면 bloat이 발생할 가능성이 높아짐
table의 전체 tuple에서 10% 이상의 dead tuple 비율:
이 정도 비율이 되면 VACUUM이 필요할 수 있으며,
default autovacuum 설정으로는 dead tuple을 줄이는게 어려울 수 있음.
이 경우 임계치를 더 낮추는 것이 좋음.
'PostgreSQL' 카테고리의 다른 글
| 18. PostgreSQL - Heap-Only Tuples(HOT) (1) | 2024.12.25 |
|---|---|
| 17. PostgreSQL - vacuum full (3) | 2024.12.25 |
| 15. PostgreSQL - VACUUM (3) | 2024.12.22 |
| 14. PostgreSQL - Visibility Map (1) | 2024.12.22 |
| 13. PostgreSQL - VACUUM 내부 동작 과정 (2) | 2024.12.21 |