본문으로 건너뛰기
13.6 핵심 메모리 파라미터

13.6 핵심 메모리 파라미터

PostgreSQL 메모리 파라미터는 연결돼 있습니다. 하나만 만져선 효과 부족, 잘못 묶으면 OOM. 1.4·5.2의 내용을 운영자의 결정 가이드로 묶어 정리합니다.

핵심 4파라미터

파라미터역할시작점
shared_buffersPG의 페이지 캐시호스트 RAM의 25%
effective_cache_size옵티마이저 힌트(OS + PG 캐시 추정)호스트 RAM의 50~75%
work_mem정렬·해시·노드당4~32MB (보수적)
maintenance_work_memVACUUM·CREATE INDEX256MB~2GB

다른 보조:

파라미터역할
temp_buffers세션 임시 테이블
autovacuum_work_memautovacuum 별도 (기본 = maintenance_work_mem)
wal_buffersWAL 버퍼 (보통 auto)

시작 매트릭스 — 워크로드별

호스트 RAM워크로드shared_bufferseffective_cache_sizework_memmaintenance_work_mem
8GBOLTP2GB6GB8MB256MB
16GBOLTP4GB12GB16MB512MB
32GBOLTP8GB24GB16MB1GB
64GBOLTP16GB48GB16~32MB1~2GB
64GB분석16GB48GB64MB (세션)4GB
128GB분석32GB96GB128MB (세션)8GB
256GB대용량64GB192GB64MB8GB

분석 워크로드는 세션 단위 SET LOCAL work_mem으로 큰 값 사용 권장합니다. 기본은 작게.

work_mem 정확 계산

peak ≈ work_mem × N(operations) × N(connections) × (1 + parallel_workers_per_query)
항목
work_mem64MB
한 쿼리당 노드 (정렬·해시)3개
max_connections200
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 PostgreSQLshared_buffers·max_connections 인스턴스에 맞춤
Azure Flexible Server자동 + 사용자 override
GCP Cloud SQLflag로 조절
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에서는 하지 말아야 할 패턴 — 안티패턴과 자주 하는 실수를 봅니다.