Backend Buffer(백엔드 버퍼)는
PostgreSQL에서 각 클라이언트(세션)별로 개별적으로 할당되는 메모리 영역이다.
이 버퍼는 쿼리 실행 시 필요한 데이터를 저장하거나 연산을 수행하는 공간으로 활용되며,
공유 메모리(shared_buffers)와는 다르게 개별 프로세스에서만 사용된다.
1️⃣ Backend Buffer란?
- PostgreSQL은 클라이언트 요청마다 개별적인 Backend Process를 생성하고, 각 프로세스는 독립적인 메모리 공간을 갖는다.
- 이 개별 프로세스가 사용하는 메모리 버퍼가 Backend Buffer.
- 주요 구성 요소:
- work_mem
- temp_buffers
- maintenance_work_mem
- catalog_cache
- optimizer/executor memory
✅ Backend Buffer는 개별 세션에만 영향을 주며, PostgreSQL 서버 전체 공유가 불가능하다.
2️⃣ Backend Buffer의 주요 구성 요소 분석
(1) work_mem (쿼리 실행 시 작업 메모리)
- 정렬(SORT), 해시 조인(HASH JOIN), 그룹화(GROUP BY) 같은 작업을 수행할 때 사용다.
- work_mem을 초과하면 임시 디스크 저장소(temp file)를 사용하게 되어 성능이 저하될 수 있음.
💡 튜닝 포인트:
- work_mem이 너무 낮으면 쿼리 성능 저하 (디스크 I/O 증가)
- work_mem이 너무 높으면 메모리 부족 현상 발생 가능 (OOM, Out Of Memory)
- 일반적으로 1GB RAM당 4MB ~ 16MB 정도 설정 추천.
-- work_mem이 초과되어 임시 디스크를 사용하는지 확인.
SELECT datname, temp_bytes, temp_files FROM pg_stat_database;
-- temp_bytes 값이 크다면 work_mem이 부족하여 디스크를 사용 중인 상태
(2) temp_buffers (임시 테이블을 위한 버퍼)
- 세션 내에서 생성된 임시 테이블의 데이터를 캐싱하는 메모리 공간.
- 개별 세션에서만 접근 가능하며, 세션이 종료되면 자동으로 메모리 해제됨.
💡 튜닝 포인트:
- 임시 테이블을 자주 사용하는 워크로드(ETL, 데이터 분석 등)에서는 값을 늘리면 성능 향상 가능
- 기본값은 8MB, ETL 작업이 많다면 64MB 이상으로 조정 가능
(3) maintenance_work_mem (유지보수 작업을 위한 메모리)
- VACUUM, CREATE INDEX, ALTER TABLE, CLUSTER 같은 유지보수 작업을 수행할 때 사용되는 메모리.
- work_mem보다 더 많은 메모리가 필요할 수 있음.
💡 튜닝 포인트:
- VACUUM FULL, REINDEX 등을 실행할 때 충분한 메모리가 필요하므로, 일반적으로 work_mem의 10배 정도 설정 추천.
- 기본값은 64MB, 인덱스 크기가 큰 테이블에서는 1GB ~ 4GB로 증가 가능.
(4) catalog_cache (시스템 카탈로그 캐싱)
- PostgreSQL의 시스템 카탈로그(메타데이터 테이블)를 저장하는 버퍼.
- 테이블 구조, 인덱스 정보, 권한 등 DDL 관련 정보를 빠르게 조회할 수 있도록 도와줌.
💡 튜닝 포인트:
- pg_class, pg_attribute, pg_proc 같은 시스템 카탈로그를 자주 조회하는 경우 증가 가능.
- 대규모 데이터베이스에서 DDL이 많다면 성능 향상을 위해 증가 가능.
(5) optimizer/executor (쿼리 최적화 및 실행 엔진 메모리)
- PostgreSQL의 쿼리 최적화 및 실행을 위한 메모리 공간.
- EXPLAIN ANALYZE 실행 시 사용하는 쿼리 실행 계획을 최적화하는데 필요한 공간.
💡 튜닝 포인트:
- 일반적으로 PostgreSQL이 자동으로 관리하므로 튜닝이 필요하지 않음.
- 대규모 조인 및 복잡한 쿼리를 실행할 때만 필요.
3️⃣ Backend Buffer 관련 최적화 전략
✔ 워크로드에 맞는 work_mem 설정
- work_mem이 너무 낮으면 정렬, 조인 시 성능 저하 발생
- work_mem을 높이면 쿼리 성능 향상 가능하지만 너무 크게 설정하면 메모리 부족(OOM) 발생
- 보통 1GB RAM당 4MB ~ 16MB 추천
✔ 임시 테이블을 많이 사용하면 temp_buffers 증가
- ETL, 데이터 분석 작업 시 temp_buffers를 64MB ~ 128MB로 조정 가능
✔ 자동 VACUUM이 너무 오래 걸린다면 maintenance_work_mem 증가
- maintenance_work_mem을 충분히 확보하면 VACUUM, CREATE INDEX 속도 향상
✔ 시스템 카탈로그 접근이 많다면 catalog_cache 튜닝 고려
- 데이터베이스 규모가 크다면 시스템 메타데이터 캐싱을 최적화하면 성능 향상 가능
정리
✅ Backend Buffer는 개별 세션에서만 사용되는 메모리 영역이며,
✅ work_mem, temp_buffers, maintenance_work_mem 등의 설정이 쿼리 성능에 직접적인 영향을 미침
✅ shared_buffers와 다르게 공유되지 않고 개별 프로세스에서만 유지됨
✅ 적절한 튜닝을 통해 정렬(SORT), 조인(JOIN), 임시 테이블 사용 성능을 최적화 가능
'PostgreSQL' 카테고리의 다른 글
| PostgreSQL - MVCC (Multi-Version Concurrency Control) (0) | 2025.02.23 |
|---|---|
| PostgreSQL - Memory - Shared Buffer (0) | 2025.02.22 |
| PostgreSQL - Idle Session' Memory (0) | 2025.02.22 |
| PostgreSQL Architecture (0) | 2025.02.22 |
| PostgreSQL Query Optimization : 실행 계획 - Scan 방식의 종류 (0) | 2024.12.29 |