Shared Buffer(공유 버퍼)는 PostgreSQL의 메모리 캐시 시스템으로,

디스크 I/O를 최소화하고 성능을 향상시키는 핵심 요소.
PostgreSQL은 데이터를 직접 디스크에서 읽지 않고,

Shared Buffer에 먼저 로드하여 읽기/쓰기 성능을 최적화한다.

 

 

1️⃣ Shared Buffer란?

  • PostgreSQL이 데이터를 디스크에서 읽거나 변경할 때 사용하는 캐시 메모리
  • 모든 백엔드 프로세스가 공유하여 반복적인 디스크 I/O를 줄이고 속도를 높임
  • shared_buffers 파라미터를 통해 크기 조정 가능
  • 운영 체제의 페이지 캐시보다 먼저 적용되어 PostgreSQL 내부에서 데이터를 직접 관리 가능

Shared Buffer를 활용하면 데이터 읽기/쓰기 성능이 크게 향상됨.

 

🔹 Shared Buffer 크기 설정 가이드

서버 RAM 크기추천 shared_buffers 값

2GB 이하 128MB ~ 256MB
4GB 512MB ~ 1GB
8GB 2GB ~ 4GB
16GB 이상 4GB ~ 8GB

RAM의 25% ~ 40% 정도 설정하면 성능 최적화 가능
✅ 너무 크게 설정하면 운영 체제 캐시(Page Cache)와 충돌 가능


2️⃣ Shared Buffer의 주요 역할

 (1) 데이터 캐싱 (Heap 및 Index)

  • 테이블(Heap)과 인덱스(Index) 데이터를 캐싱하여 빠른 조회 가능
  • 최근 사용된 데이터는 Shared Buffer에 남아 있어 성능 최적화

쿼리 실행 시 데이터가 Shared Buffer에 있다면 디스크 접근 없이 즉시 반환 가능!


 (2) 데이터 수정 및 트랜잭션 관리

  • INSERT, UPDATE, DELETE 작업 시 Shared Buffer에서 먼저 반영됨
  • 변경된 데이터는 바로 디스크에 쓰이지 않고 WAL(Write-Ahead Logging) 로그에 기록됨
  • Checkpointer가 일정 시간마다 디스크로 데이터를 저장

변경된 데이터는 바로 디스크에 기록되지 않고, 먼저 Shared Buffer에서 처리됨 → 성능 최적화


 (3) Background Writer를 통한 버퍼 정리

  • PostgreSQL은 Background Writer 프로세스를 사용하여 Shared Buffer에서 변경된 데이터를 주기적으로 디스크에 기록
  • Checkpointer는 일정 시점마다 완전히 기록(Checkpoint)하여 데이터 무결성을 보장

이 메커니즘 덕분에 PostgreSQL은 데이터 무결성을 유지하면서 성능을 극대화할 수 있음


3️⃣ Shared Buffer의 동작 원리

 (1) 페이지 캐싱 전략

PostgreSQL은 LRU (Least Recently Used) 알고리즘을 기반으로 Shared Buffer를 관리.

  • 자주 사용되는 페이지는 Shared Buffer에 남아 있음
  • 오래 사용되지 않은 페이지는 새로운 데이터가 필요할 때 제거됨

가장 최근에 사용된 데이터는 유지되고, 사용되지 않는 데이터는 새로운 데이터로 교체됨


 (2) Buffer Mapping (버퍼 매핑)

Shared Buffer는 고정된 크기의 버퍼 블록으로 나뉘며, 각 블록은 테이블 및 인덱스 페이지를 저장.

버퍼가 가득 차면 PostgreSQL은 오래된 페이지를 버리고 새로운 데이터를 캐싱함

 

 

4️⃣ Shared Buffer 성능 분석 및 모니터링

🔹 현재 버퍼 상태 확인

SELECT usagecount, count(*) 
FROM pg_buffercache 
GROUP BY usagecount 
ORDER BY usagecount DESC;

 

  • usagecount 값이 높을수록 자주 사용되는 데이터임
  • 사용되지 않는 버퍼가 많다면 shared_buffers를 줄일 필요가 있음

 

🔹 Shared Buffer Hit Ratio(캐시 적중률) 분석

SELECT 
  sum(blks_hit) / (sum(blks_hit) + sum(blks_read)) AS buffer_hit_ratio
FROM pg_stat_database;

캐시 적중률이 90% 이상이면 최적화된 상태!
80% 이하이면 shared_buffers를 늘려야 함

 

🔹 디스크 I/O 감소 여부 확인

SELECT 
  sum(heap_blks_hit) / sum(heap_blks_hit + heap_blks_read) AS table_cache_hit_ratio,
  sum(idx_blks_hit) / sum(idx_blks_hit + idx_blks_read) AS index_cache_hit_ratio
FROM pg_statio_user_tables;

테이블 및 인덱스 캐시 적중률이 90% 이상이면 성능이 최적화됨

 

5️⃣ Shared Buffer 최적화 전략

서버 RAM의 25%~40%를 Shared Buffer에 할당
캐시 적중률(buffer hit ratio)을 90% 이상 유지
백그라운드 프로세스(BGWriter, Checkpointer)를 튜닝하여 효과적인 버퍼 관리
너무 큰 Shared Buffer는 OS Page Cache와 충돌할 수 있으므로 적절한 값 설정 필요

 

정리,

Shared Buffer는 PostgreSQL 성능 최적화의 핵심이며, 올바른 크기로 설정하면 I/O 성능을 획기적으로 개선할 수 있음!

 

 

'PostgreSQL' 카테고리의 다른 글

PostgreSQL - Tuple  (0) 2025.02.23
PostgreSQL - MVCC (Multi-Version Concurrency Control)  (0) 2025.02.23
PostgreSQL - Memory - Backend Buffer  (0) 2025.02.22
PostgreSQL - Idle Session' Memory  (0) 2025.02.22
PostgreSQL Architecture  (0) 2025.02.22

+ Recent posts