13.6 핵심 메모리 파라미터
PostgreSQL 메모리 파라미터는 연결돼 있습니다. 하나만 만져선 효과 부족, 잘못 묶으면 OOM. 1.4·5.2의 내용을 운영자의 결정 가이드로 묶어 정리합니다.
핵심 4파라미터
| 파라미터 | 역할 | 시작점 |
|---|---|---|
shared_buffers | PG의 페이지 캐시 | 호스트 RAM의 25% |
effective_cache_size | 옵티마이저 힌트(OS + PG 캐시 추정) | 호스트 RAM의 50~75% |
work_mem | 정렬·해시·노드당 | 4~32MB (보수적) |
maintenance_work_mem | VACUUM·CREATE INDEX | 256MB~2GB |
다른 보조:
| 파라미터 | 역할 |
|---|---|
temp_buffers | 세션 임시 테이블 |
autovacuum_work_mem | autovacuum 별도 (기본 = maintenance_work_mem) |
wal_buffers | WAL 버퍼 (보통 auto) |
시작 매트릭스 — 워크로드별
| 호스트 RAM | 워크로드 | shared_buffers | effective_cache_size | work_mem | maintenance_work_mem |
|---|---|---|---|---|---|
| 8GB | OLTP | 2GB | 6GB | 8MB | 256MB |
| 16GB | OLTP | 4GB | 12GB | 16MB | 512MB |
| 32GB | OLTP | 8GB | 24GB | 16MB | 1GB |
| 64GB | OLTP | 16GB | 48GB | 16~32MB | 1~2GB |
| 64GB | 분석 | 16GB | 48GB | 64MB (세션) | 4GB |
| 128GB | 분석 | 32GB | 96GB | 128MB (세션) | 8GB |
| 256GB | 대용량 | 64GB | 192GB | 64MB | 8GB |
분석 워크로드는 세션 단위 SET LOCAL work_mem으로 큰 값 사용 권장합니다. 기본은 작게.
work_mem 정확 계산
peak ≈ work_mem × N(operations) × N(connections) × (1 + parallel_workers_per_query)| 항목 | 값 |
|---|---|
| work_mem | 64MB |
| 한 쿼리당 노드 (정렬·해시) | 3개 |
| max_connections | 200 |
| parallel | +2 |
→ 최악 = 64 × 3 × 200 × 3 = 약 115GB (이론). 실제 동시 안 됩니다.
운영 권장:
work_mem은 작게 디폴트- 무거운 쿼리는 세션 단위로 SET
-- 분석 세션
SET work_mem = '512MB';
SELECT ... ;
RESET work_mem;shared_buffers 결정의 미묘
| 크기 | 효과 |
|---|---|
| 호스트 RAM 15% | OS cache 의존 ↑, 빠른 시작 |
| 25% (권장) | 균형 |
| 35~40% | hot 데이터셋이 잘 들어가는 경우만 |
| 50%+ | 이중 캐싱 손해, 권장 안 함 |
같은 RAM에서 shared_buffers를 키울지 work_mem을 키울지 저울질:
- 같은 데이터를 자주 읽음 → shared_buffers
- 동시 분석 쿼리가 많음 → work_mem (세션 단위 권장)
effective_cache_size — 옵티마이저 힌트
effective_cache_size = shared_buffers + OS page cache 추정호스트 RAM의 50~75%가 출발. 옵티마이저가 인덱스 스캔 vs 시퀀셜을 비교할 때 참고합니다.
메모리 할당하지 않음. 그냥 힌트. 너무 작으면 옵티마이저가 인덱스 스캔 과대 비용 추정합니다.
maintenance_work_mem — autovacuum과의 관계
autovacuum_work_mem = -1 -- = maintenance_work_mem기본은 같이 묶임. autovacuum이 maintenance_work_mem을 다 차지하면 큰 인덱스 빌드 메모리가 부족.
ALTER SYSTEM SET maintenance_work_mem = '2GB';
ALTER SYSTEM SET autovacuum_work_mem = '256MB'; -- autovacuum 별도autovacuum 워커당 autovacuum_work_mem × autovacuum_max_workers만큼 차지 (256MB × 5 = 1.25GB).
wal_buffers
wal_buffers = -1 -- auto: shared_buffers의 1/32, max 16MB대부분 그대로. 커밋 TPS가 매우 높을 때만 32MB·64MB.
wal_buffers_full(pg_stat_wal)이 자주 증가하면 키움.
실전 튜닝 — 4단계
flowchart TD
S["시작값 선택<br/>(워크로드 매트릭스)"]
M["측정<br/>(temp_files, evictions, swap)"]
D{"문제?"}
W["work_mem 증액<br/>(세션 단위 우선)"]
SB["shared_buffers 증액"]
MWM["maintenance_work_mem 증액"]
END["완료"]
S --> M --> D
D -- "temp_files 많음" --> W --> M
D -- "buffer evictions 많음" --> SB --> M
D -- "VACUUM 느림" --> MWM --> M
D -- "정상" --> END
classDef step fill:#dbeafe,stroke:#1d4ed8,color:#1e3a8a
classDef done fill:#d1fae5,stroke:#047857,color:#064e3b
class S,M,W,SB,MWM step
class END,D done
진단 SQL
-- temp_file (work_mem 부족 신호)
SELECT datname,
temp_files,
pg_size_pretty(temp_bytes) AS temp_size
FROM pg_stat_database
WHERE datname = current_database();
-- shared_buffers evict (cache miss)
SELECT * FROM pg_stat_io WHERE op = 'evict'; -- PG 16+
-- wal_buffers 부족
SELECT wal_buffers_full FROM pg_stat_wal;
-- 현재 메모리 파라미터
SELECT name, setting, unit FROM pg_settings
WHERE name IN ('shared_buffers','work_mem','effective_cache_size',
'maintenance_work_mem','wal_buffers','temp_buffers');클라우드 매니지드의 자동 튜닝
| 클라우드 | 자동 |
|---|---|
| AWS RDS PostgreSQL | 인스턴스 클래스별 자동, parameter group 수정 가능 |
| Aurora PostgreSQL | shared_buffers·max_connections 인스턴스에 맞춤 |
| Azure Flexible Server | 자동 + 사용자 override |
| GCP Cloud SQL | flag로 조절 |
| NCP Cloud DB | 콘솔 설정 |
매니지드 환경은 OS·HW 권장 일부 적용 안 됨 (THP·NUMA 등 콘솔에서 못 만짐). 인스턴스 크기 변경이 표준 튜닝 수단.
운영 안티패턴
| 안티패턴 | 결과 |
|---|---|
| shared_buffers = 호스트 RAM 50% | OS cache 부족, 이중 캐싱 |
| work_mem = 1GB 디폴트 | OOM 위험 |
| maintenance_work_mem 무리하게 큼 | autovacuum이 다 잡아먹음 |
| effective_cache_size 1GB | 옵티마이저가 항상 seq scan 선호 |
| 모든 메모리 파라미터를 한 번에 변경 | 효과 분석 불가 |
메모리 튜닝은 한 파라미터씩 + 측정. shared_buffers 변경은 restart 필요 — 점검 시간 잡기. work_mem은 reload만으로도 적용합니다. 우선 work_mem부터 만지는 게 안전합니다.
정리
- 4파라미터: shared_buffers·effective_cache_size·work_mem·maintenance_work_mem
- 시작점: 호스트 RAM 25% + 50~75% + 16MB + 1GB
- work_mem은 작게 디폴트, 분석 쿼리만 세션 단위
- shared_buffers 50%+는 손해
- autovacuum_work_mem은 maintenance에서 분리하면 큰 인덱스 빌드 메모리 확보
- 변경은 하나씩 + 측정합니다. 클라우드 매니지드는 인스턴스 크기로 대신
Part XIII 성능과 튜닝이 끝났습니다. 다음 Part XIV에서는 하지 말아야 할 패턴 — 안티패턴과 자주 하는 실수를 봅니다.