본문 바로가기

PostgreSQL & EPAS

PostgreSQL & EPAS System Architecture - 2. Memory

PostgreSQL & EPAS Architecture - 2.Memory

 

Overall

 

PostgreSQL & EPAS 서버에서 사용하는 메모리 구조는 크게 2가지로 분류할 수 있다.

 

1.Shared Memory

- PostgreSQL Server 내 모든 프로세스들이 사용하는 공유 메모리 영역

2.Local Memory 

- Postmaster에서 생성한 backend process(세션) 마다 할당되는 메모리  

 

 

Shared Memory

 

Shared buffers

- 데이터에 대한 Select, DML을 수행하기 위해 디스크 영역에 있는 Data를 캐싱하는 메모리 공간

- 실제 메모리의 25%를 할당하여 사용하는 것으로 권장

- 페이지 교체 알고리즘으로 Clock Sweep 알고리즘을 사용

 

WAL buffers

- ACID(그중 A,D)를 보장하기 위한 Write ahed loging을 위한 영역으로 트랜잭션에 대한 변경 내역을 캐싱하는 메모리 공간

- WalWriter에 의해 디스크(Wal File)로 flush 되며 해당 WAL 파일은 복구 목적으로 사용됨

- 일반적으로 Shared Buffers의 3% 를 할당\

 

CLOG buffers 

- 트랜잭션 상태를 보관하는 메모리 공간 

IN_PROGRESS, COMMITTED, ABORTED,  SUB_COMMITTED 상태가 나타나며 체크포인트가 수행될 때 pg_xact 디렉토리에 Flush

- 트랜잭션의 커밋정보를 활용해 MVCC에서 불필요한 Disk Read를 방지하고자 사용 됨

 

Lock Space

- Lock과 관련된 정보를 보관하는 메모리 공간

- 모든 서버 프로세스는 해당 정보를 공유

- 파티션 테이블을 조회할 때 다량의 Lock이 발생할 수 있으므로 max_locks_per_transaction의 조정이 필요할 수 있음

 

Other Buffers

- 통계정보 Buffers

- Two Phase commit 관련 Buffers

- checkpointer 및 autovacuum과 같은 다양한 백그라운드 프로세스를 위한 Buffers 등등이 존재

Local Memory

Maintenace_work_mem

- 다양한 작업에 사용 되는 메모리 공간으로 기본값은 64MB이고, work_mem의 1.5배를 권장

- Vacuum 작업, 인덱스 생성 작업에 사용

- 해당 작업을 수행 할 때는 각 세션 마다 set maintenance_work_mem = '1GB'; 등과 같이 설정하여 수행

 

temp_buffers

- 세션 단위로 임시 테이블에 접근하기 위해 사용하는 메모리 공간으로 기본값은 8MB

 

work_mem

- 정렬 작업(Order by, Group by, DISTINCT), 조인 작업(Merge)시 사용하는 메모리 공간으로 기본값은 4MB

- (실제 메모리 - Shared Buffers ) / Max_connections로 계산하여 할당하여 사용하는 것으로 권장

- work_mem가 부족할 경우 디스크 영역(Temp 파일) 사용

 

catalog_cache

- pg_catalog 스키마 내부의 메타데이터를 이용할 때 사용하는 메모리 공간

- 모든 세션에서 메타데이터를 조회할 수 있으므로 각 세션마다 메모리를 해둠

 

Optimizer / executor 

- 쿼리 수행을 위한 실행계획 및 직접적인 실행시 사용하는 메모리 공간

 

 

 

(그림 출처 및 참고 자료)

 

https://www.interdb.jp/pg/pgsql02.html

https://exem.tistory.com/1645?category=1010730

postgresql.org

enterprisedb.com

https://bit.ly/3wsxU43

 

모든 포스팅은 공식사이트 및 위 Facebook PostgreSQL Korea 그룹 관리자 페이지에서 공유 된 Google Docs에 있는 서버 관리자 지침서(https://bit.ly/3wsxU43) 를 참고하여 작성되었습니다.