백엔드 데이터 인프라 43편. postgresql.conf 핵심 설정 — 메모리·로그·복제·연결·체크포인트 운영 표준 풀어쓴 학습 노트.
이 글은 백엔드 데이터 인프라 시리즈 70편 중 43편이에요. PG 의 모든 설정이 모인 postgresql.conf 의 핵심.
설정 위치·우선순위
1. 명령행 옵션 (가장 강함)
2. ALTER SYSTEM (postgresql.auto.conf)
3. postgresql.conf 메인
4. include 디렉토리
5. 기본값
설정 보기
SHOW shared_buffers;
SHOW ALL;
SELECT name, setting, unit, source
FROM pg_settings
WHERE name LIKE '%memory%';
동적 변경
-- 세션
SET work_mem = '256MB';
-- 전역 (재시작 불필요 항목만)
ALTER SYSTEM SET log_min_duration_statement = 1000;
SELECT pg_reload_conf();
-- 재시작 필요 항목 (shared_buffers 등)
ALTER SYSTEM SET shared_buffers = '4GB';
-- → 서버 재시작 필요
메모리 설정
41편 성능 팁 의 메모리 영역.
shared_buffers = 2GB # 호스트 25%
effective_cache_size = 6GB # 호스트 75%
work_mem = 16MB
maintenance_work_mem = 512MB
huge_pages = try # Linux HugePages (운영 권장)
huge_pages
리눅스 huge pages 활용. 대용량 메모리 시스템의 페이지 테이블 부담 감소.
# /etc/sysctl.conf
vm.nr_hugepages = 1024
연결 설정
max_connections = 100 # 최대 동시 연결
superuser_reserved_connections = 3
max_connections = PgBouncer 와의 관계 중요. PgBouncer pool = 25, max_connections = 100 이면 충분.
listen_addresses = '*' # 모든 IP listen
port = 5432
인증 — pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD
local all postgres peer
local all all scram-sha-256
host all all 10.0.0.0/8 scram-sha-256
host replication replicator 10.0.0.0/8 scram-sha-256
hostssl all all 0.0.0.0/0 scram-sha-256
scram-sha-256 = PG 10+ 표준. md5 는 deprecated.
-- 변경 후 reload
SELECT pg_reload_conf();
로깅
log_destination = 'stderr'
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d.log'
log_rotation_age = 1d
log_rotation_size = 100MB
log_truncate_on_rotation = on
log_min_messages = warning # 로그 수준
log_min_error_statement = error
log_min_duration_statement = 1000 # 1초+ 쿼리 로그
log_checkpoints = on
log_connections = on
log_disconnections = on
log_duration = off # 모든 쿼리 시간 (디버깅 시만)
log_lock_waits = on
log_temp_files = 0 # 모든 임시 파일 (work_mem 부족)
log_autovacuum_min_duration = 0 # 모든 autovacuum
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,client=%h '
로그 분석 도구
pgBadger -o report.html /var/log/postgresql/*.log
PG 운영의 표준 분석 도구. 슬로우 쿼리·연결·임시 파일·체크포인트 모두 시각화.
체크포인트·WAL
wal_level = replica # 복제 가능 수준
max_wal_size = 4GB
min_wal_size = 1GB
checkpoint_timeout = 15min
checkpoint_completion_target = 0.9
wal_buffers = 16MB
wal_compression = on # PG 14+
synchronous_commit = on # 안전성 ↑
fsync = on # 안전성 ↑↑
fsync = on = 절대 변경 X (안 그러면 크래시 시 데이터 손실).
복제
# Primary
wal_level = replica
max_wal_senders = 10
wal_keep_size = 16GB
hot_standby = on
# Replica
primary_conninfo = 'host=primary.example.com user=replicator'
물리 복제 표준. 논리 복제 (wal_level = logical) 는 부분 복제·다른 PG 버전 간.
autovacuum
autovacuum = on
autovacuum_max_workers = 4
autovacuum_naptime = 1min
autovacuum_vacuum_threshold = 50
autovacuum_vacuum_scale_factor = 0.2 # 큰 테이블엔 너무 큼
autovacuum_analyze_threshold = 50
autovacuum_analyze_scale_factor = 0.1
autovacuum_freeze_max_age = 200000000 # Wraparound 방지
autovacuum_vacuum_cost_delay = 2ms # CPU 부담 줄임
큰 테이블 = ALTER TABLE SET (autovacuum_vacuum_scale_factor = 0.05).
계획자
random_page_cost = 1.1 # SSD 시 (HDD 는 4)
effective_io_concurrency = 200 # SSD 시 (HDD 는 1)
default_statistics_target = 100 # 통계 정밀도
SSD = random_page_cost 낮추기 무조건. 기본 4 는 HDD 가정. PG 가 인덱스 더 적극 사용.
확장·로컬
shared_preload_libraries = 'pg_stat_statements,auto_explain'
timezone = 'Asia/Seoul'
lc_messages = 'en_US.UTF-8'
default_text_search_config = 'pg_catalog.simple'
pg_stat_statements = 운영 필수. auto_explain = 슬로우 쿼리 자동 EXPLAIN 로깅.
운영 표준 한 묶음
# 호스트 8GB·SSD 가정
shared_buffers = 2GB
effective_cache_size = 6GB
work_mem = 16MB
maintenance_work_mem = 512MB
max_connections = 100
wal_level = replica
max_wal_size = 4GB
checkpoint_timeout = 15min
checkpoint_completion_target = 0.9
wal_compression = on
synchronous_commit = on
random_page_cost = 1.1
effective_io_concurrency = 200
log_min_duration_statement = 1000
log_checkpoints = on
log_lock_waits = on
log_temp_files = 0
log_autovacuum_min_duration = 0
shared_preload_libraries = 'pg_stat_statements,auto_explain'
auto_explain.log_min_duration = '5s'
auto_explain.log_analyze = on
auto_explain.log_buffers = on
autovacuum_max_workers = 4
autovacuum_vacuum_cost_delay = 2ms
이 한 묶음이 — 8GB·SSD 호스트의 합리적 시작점. 운영에서 모니터링 후 조정.
RDS 의 경우
RDS = postgresql.conf 직접 X. 파라미터 그룹 으로:
AWS Console → RDS → Parameter Groups → 새 그룹 → 수정
또는 IaC:
resource "aws_db_parameter_group" "main" {
name = "pg18-prod"
family = "postgres18"
parameter { name = "shared_buffers" value = "{DBInstanceClassMemory/4}" }
parameter { name = "log_min_duration_statement" value = "1000" }
}
함정 5가지
(1) 기본값 그대로
PG 기본 = 1GB 호스트 가정. 운영 = 무조건 튜닝.
(2) random_page_cost = 4 (HDD 기본)
SSD = 1.1. PG 계획자가 인덱스 사용 결정에 영향.
(3) pg_stat_statements 안 박음
운영 환경에 모니터링 없음 = 느린 쿼리 발견 못 함.
(4) auto_explain 안 활용
슬로우 쿼리의 EXPLAIN 을 자동 로깅. 디버깅 매우 편함.
(5) ALTER SYSTEM vs 파일 수정 혼동
ALTER SYSTEM = postgresql.auto.conf 에 박힘 (postgresql.conf 와 별도). 두 파일 충돌 시 자동 우세. 운영 = 한 가지 방식 통일.
shared_buffers·effective_cache_size·work_mem·max_connections·wal_level·max_wal_size·random_page_cost·log_min_duration_statement·shared_preload_libraries(pg_stat_statements + auto_explain)·autovacuum_vacuum_scale_factor. 운영 첫 셋업 체크리스트.
한 줄 정리 — postgresql.conf 핵심 영역 = 메모리·연결·로그·체크포인트·복제·autovacuum·계획자·확장. SSD = random_page_cost 1.1. pg_stat_statements + auto_explain 필수. RDS = 파라미터 그룹.
시험 직전 한 번 더 — postgresql.conf 입문자가 매번 헷갈리는 것
- 우선순위 = 명령행 > ALTER SYSTEM > 파일 > 기본
- SHOW name·SHOW ALL
- pg_settings 시스템 뷰
- ALTER SYSTEM = 동적 (postgresql.auto.conf)
- pg_reload_conf() = reload (재시작 불필요 항목)
- shared_buffers = 25%
- effective_cache_size = 75%
- work_mem = 16MB (동적 SET)
- huge_pages = try (Linux)
- max_connections = 100 (PgBouncer 와 짝)
- listen_addresses = '*'
- pg_hba.conf = 인증 (scram-sha-256)
- logging_collector = on
- log_min_duration_statement = 1000 (1초+)
- log_checkpoints·log_lock_waits·log_temp_files
- pgBadger = 로그 분석
- wal_level = replica
- checkpoint_timeout 15min
- wal_compression on (PG 14+)
- fsync = on (절대 변경 X)
- synchronous_commit = on
- random_page_cost = 1.1 (SSD)
- effective_io_concurrency = 200 (SSD)
- autovacuum_vacuum_scale_factor = 0.05~0.1 (큰 테이블)
- shared_preload_libraries = 'pg_stat_statements,auto_explain'
- auto_explain.log_min_duration = 5s
- RDS = 파라미터 그룹
- 운영 첫 셋업 = 10개 설정 체크
- timezone = 'Asia/Seoul'
시리즈 다른 편
- Part 3 운영: 42편 설치 · 43편 (현재 글)
시리즈 다음 글
다음 글(44편)에서는 사용자·역할 관리 — CREATE ROLE·GRANT·REVOKE 운영.
공식 문서: PostgreSQL 18 — Server Configuration에서 더 자세한 사양을 확인할 수 있어요.