Buffer Replacement를 위한 Clock Sweep Algorithm
[PostgreSQL 9.6 성능이야기] 편,
스리슬쩍 공부한다꼬 책 보면서 요약
내용에 틀린 부분이 있을 수 있음!
- Victim
Share Buffer 내에 empty buffer 없다면 Share Buffer 내의 버퍼를 디스크에 기록해야 한다.
이때 디스크로 기록되는 버퍼를 Victim 버퍼라고 한다.
- Buffer Replacement Algorithm
Victim 버퍼를 선정하는 중요한 알고리즘으로
Share Buffer 의 목적이 Disk read 를 최소화해서 성능을 향상하기 위한 것이므로, 효율적으로 버퍼를 관리하기 위해 사용된다
- Clock Sweep Algoritm
PostgreSQL은 Buffer Replacement 를 위해서 Clock Sweep 알고리즘을 사용한다
Not Frequently Used, NFU 알고리즘의 일종으로, 덜 사용된 버퍼를 Victim 버퍼로 선정하는 알고리즘이다.
버퍼를 시계방향으로 탐색하면서 Victim버퍼를 찾는다.
- BM_MAX_USAGE_COUNT (default 5)
버퍼를 액세스 할 때마다 state의 usage_count+=1 ; -- 1만큼 증가시킨다.
BM_MAX_USAGE_COUNT 에 정의된 수치만큼만 증가한다.
- Victim 버퍼로 선정
refcount와 usage_count가 모두 0 인 버퍼를 Victim 버퍼로 선정한다.
-- 만일 Victim 버퍼가 dirty버퍼이면 해당 버퍼 내용을 디스크에 기록한다.
- 공정한 경쟁
ORACLE의 터치 카운트 알고리즘에서 N초 이내에 동일 버퍼에 발생한 엑세스는 touch_count를 증가시키지 않는 것과 같다.
PostgreSQL에서 N초 이내에 동일한 버퍼에 대한 엑세스가 수십만번 발생하더라도 usage_count 는 5 (=BM_MAX_USAGE_COUNT) 이고
특정 시점에 아무리 액세스를 많이 해도 Clock Sweep 6차례 회전하기 전에 다시 액세스되지 않는다면 해당 버퍼또한 Victim 버퍼로 선정된다.
.. 노랑색은 좀 더 살펴보기 ..