본문 바로가기

PostgreSQL

Shared Buffer Tuning

Shared Buffer의 목적은 DISK IO를 최소화함으로써 IO 성능을 향상하는 것이다.

1) 매우 큰 (수십, 수백 GB) 버퍼를 빠르게 액세스해야 한다.

2) 많은 사용자가 동시에 접근할 때 경합을 최소화해야 한다.

3) 자주 사용되는 블록은 최대한 오랫동안 버퍼 내에 있어야 한다.

 

Shared Buffer의 구조는 크게

1) 해시 테이블 2) 해시 엘리먼트 3) 버퍼 디스크립터 4) 버퍼 풀 로 구성된다.

 

Buffer Replacement를 위한 Clock Sweep 알고리즘

Clock Sweep 알고리즘은 덜 사용된 버퍼를 Victim 버퍼로 선정하는 알고리즘으로써

NFU (Not Frequently Used) 알고리즘의 일종이다.

버퍼가 액세스될 때마다 usage_count 1씩 증가하며 최대 5 (BM_MAX_USAGE_COUNT) 까지 증가한다

짧은 시간에 아무리 많이 액세스되도 usage_count 5를 넘지 않는다.

Clock Sweep이 수행되면 usage_count 1씩 감소한다.

 

Bulk Read로부터 Buffer를 보호하는 방법

IO 유형을 4가지로 구분하고, 이때 Bulk Read인 경우에는 Ring Buffer를 사용하도록 한다.

Bulk Read Shared Buffer ¼보다 큰 테이블에 대한 Seq Scan을 의미한다.

Bulk Read를 위한 Ring Buffer의 크기는 32 블록이다.

 

pg_prewarm()익스텐션을 이용한 IO 튜닝 방안

pg_prewarm() 익스텐션을 이용하면 테이블과 인덱스를 Shared Buffer로 로딩할 수 있다.

Shared Buffer ¼보다 큰 테이블도 로딩이 가능하다.

1회성 작업이다. 따라서 Batch 작업 전에 적절히 사용하면 IO 향상에 큰 효과를 낼 수 있다.

'PostgreSQL' 카테고리의 다른 글

HOT (Heap Only Tuple)  (0) 2021.04.23
Vacuum, Auto Vacuum  (0) 2021.04.23
MVCC (다중 버전 읽기 일관성)  (0) 2021.04.23
PostgreSQL 아키텍처  (0) 2021.04.23
PostgreSQL DDL, DML, DCL 문법  (0) 2021.04.05