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 |