PostgreSQL에서 캐시 관련 설정 및 사이즈는 성능에 큰 영향을 미칩니다. 크게 나누면 PostgreSQL 자체 캐시(shared_buffers)와 운영체제의 파일 시스템 캐시(OS Page Cache)로 나눌 수 있으며, PostgreSQL 내부에서도 다양한 메모리 캐시 영역이 있습니다. 아래는 그 종류와 각각의 확인/설정 방법입니다.
| 캐시 종류 | 설명 | 확인 방법 | 설정 위치 |
|---|---|---|---|
shared_buffers | PostgreSQL가 직접 사용하는 메모리 캐시. 테이블/인덱스 블록을 여기에 저장 | SHOW shared_buffers; | postgresql.conf |
| OS Page Cache | OS가 디스크 I/O 후 자동으로 메모리에 보관. PostgreSQL이 직접 제어하진 않음 | vmstat, free, top 명령어로 확인 (Linux) | OS 커널 설정 |
work_mem | 정렬(SORT), 해시 조인 등 쿼리 연산 중 쓰이는 임시 메모리 | SHOW work_mem; | postgresql.conf |
maintenance_work_mem | VACUUM, CREATE INDEX 등 유지보수 작업 시 사용하는 캐시 | SHOW maintenance_work_mem; | postgresql.conf |
effective_cache_size | PostgreSQL이 쿼리 플래너에게 OS 캐시 크기를 힌트로 제공하는 설정. 직접 사용하진 않음 | SHOW effective_cache_size; | postgresql.conf |
temp_buffers | 임시 테이블에 사용하는 캐시 (세션 단위) | SHOW temp_buffers; | postgresql.conf or 세션 설정 |
wal_buffers | WAL 데이터를 디스크 쓰기 전에 보관하는 버퍼 | SHOW wal_buffers; | postgresql.conf |
pg_buffercache (확장) | 실제 현재 shared_buffers에 어떤 블록이 올라와 있는지 조회 가능 | SELECT * FROM pg_buffercache; | 확장 설치 필요 (CREATE EXTENSION) |
SHOW shared_buffers;
또는 설정 파일에서 확인:
# postgresql.conf
# 일반적으로 전체 시스템 메모리의 25~40% 정도가 적당합
shared_buffers = 512MB
SHOW work_mem;
-- 세션 단위 설정 (예: 8MB로 일시 변경)
-- 정렬이나 조인 많은 쿼리에서는 너무 작으면 디스크 I/O 발생 (pg_temp 파일), 너무 크면 메모리 폭주 가능
SET work_mem = '8MB';
-- 이 값은 PostgreSQL의 쿼리 플래너가 인덱스 사용 여부를 판단할 때 참조하는 가상 값입니다. 실제 캐시가 아님
SHOW effective_cache_size;
-- 확장 설치
CREATE EXTENSION IF NOT EXISTS pg_buffercache;
-- 캐시에 올라와 있는 테이블 블록 확인
SELECT c.relname, count(*) AS buffers
FROM pg_buffercache b
JOIN pg_class c ON b.relfilenode = pg_relation_filenode(c.oid)
GROUP BY c.relname
ORDER BY buffers DESC;