gc cr/current grant 2-way
- gc cr/current request 이벤트에 대한 Fixed-up 이벤트로, 블록을 요청한 프로세스가
마스터 노드로부터 블록을 읽을 권한을 부여받았음을(Grant) 의미한다.- 요청 노드의 유저 프로세스가 특정 데이터 블록을 읽고자 한다.
- 유저 프로세스는 해당 데이터 블록의 적절한 버전이 로컬 버퍼 캐쉬에 없는 것을 확인하고,
마스터 노드의 LMS 프로세스에 블록 전송을 요청.
(응답을 받을 때까지 gc cr/current request 이벤트 대기) - 마스터 노드의 LMS 프로세스는 GRD를 참조하여, 클러스터의 어떤 노드도 해당 블록 이미지를
로컬 캐시에 가지고 있지 않다는 것을 확인하고, 요청노드에 블록을 직접 읽을 권한을 부여. - 유저 프로세스는 블록을 읽을 권한을 부여 받은 후, gc cr/current request 이벤트를
Fixed-up 이벤트인 gc cr/current grant 2-way 이벤트로 변경. - 권한을 부여 받은 후에는 일반적으로 싱글 블록 I/O를 통해 해당 블록을 디스크에서 직접
읽어 드린다(db file sequential read 이벤트 대기) - 만일 로컬 캐시에 BL락을 업그레이드(S->X) 혹은 다운그레이드(X->S) 가능한 버전의 블록이
있다면 해당 블록에 대해 락 변환을 수행한 후 사용.
-- rac_test(마스터 노드가 노드 2). 1,2 노드 버퍼 캐쉬 플러시
SQL#1> ALTER SYSTEM FLUSH BUFFER_CACHE;
SQL#2> ALTER SYSTEM FLUSH BUFFER_CACHE;
-- 노드 1에서 두 번에 걸쳐 rac_test 테이블에 대해 일관된 읽기 모드의 블록 요쳥을 수행(Full Table Scan : 멀티 블록 I/O)
SQL#1> SELECT * FROM rac_test;
SQL#1> /
- 1번째 요청(최초요청)
- gc cr grant 2-way이벤트와 db file sequential read 이벤트에 대한 대기가 순차적으로 발생.
(이 두개의 대기 이벤트는 세그먼트 헤더 블록에 대한 읽기 요청) - 데이터 블록들에 대해서는 멀티 블록 I/O가 발생하며, gc cr multi block request 이벤트와
db file scattered read 이벤트 대기가 반복적으로 발생 (p.103 참조)
(10g R1 : 한번의 멀티 블록 I/O에서 요청하는 블록수만큼 gc cr multi block request 대기가 반복적으로 발생.
10g R2 : 한번의 멀티 블록 I/O 요청에 대해 gc cr multi block request 대기는 한번만 발생.)
- 2번째 요청
- 글로벌 캐시 동기화 작업이 발생하지 않는다. 1번째 요청을 통해 데이터 블록들에 대해 BL락을 이미 공유 모드로 획득했기 때문
- 블록을 읽을 권한을 부여하는 과정은 2-way 통신만으로 이루어지기 때문에 gc cr/current grant 3-way와 같은 대기 이벤트는 존재하지 않는다는 점에 주의.
Grant와 디스트 I/O, 락 변환과의 관계
- gc cr/current grant 2-way 이벤트가 항상 디스크 I/O로 이어지지는 않는다.
- 만일 락 모드 변환이 가능한 버전의 블록이 있다면 해당 블록을 재활요하며, 이 경우에는
디스크 I/O가 발생하지 않는다. (gc cr/current grant busy 이벤트에도 동일하게 적용) - "Grant"라는 용어는 특정 블록을 디스크에서 읽을 권하만을 지칭하는 것이 아니라, BL 락 모드 변환 권한까지 같이 지칭하는 것으로 이해할 수 있다.
(락 모드 변환은 권한 없음, 널 모드, 공유 모드, 독점 모드간에 이루어 짐) - 락 모드 변환은 gc cr/current grant ... 류의 이벤트, gc cr/current block ... 류의 이벤트에서 발생.
gc current grant 2-way 이벤트와 HWM 이동과의 관계
- gc current grant 2-way 이벤트에 대한 대기와 enq: HW contention 이벤트에 대한 대기가 같이 관찰되는 경우.
- 세그먼트에 새로운 데이터를 추가(Insert)하는 과정에서 프리 블록이 소진되면, HWM을 이동해서 가용한 블록들을 추가로 할당.
- 새로 추가된 블록들에 대해 Insert 작업을 수행하려면 BL락을 독점 모드로 획득해야 한다.
- BL 락을 획득하고자 하는 요청 노드의 프로세스는 마스터 노드에게 해당 블록에 대한 권한을 요청한 후 gc current request 이벤트를 대기.
- 마스터 노드는 해당 블록을 점유한 노드가 없다는 것을 확인한 후, 권한을 부여하는 메시지를 보낸다.
- 응답을 받은 요청 노드는 gc cr/current grant 2-way 이벤트로 변경.
- 세그먼트 공간 관리 기법으로 ASSM을 사용하는 경우 각 노드가 가능한 자신만의 프리 블록을 사용하게끔 보장.
- 노드 A가 할당 받은 프리 블록을 노드 B가 사용할 확률이 대단히 낮다.
따라서 HWM 이동에 의해 할당된 프리 블록을 획득하는 과정에서 대부분 gc current grant 2-way 이벤트를 대기하는 것으로 관찰. - 하지만, 프리 블록에 대한 요구가 매우 많은 경우에는 다른 노드에게 할당된 프리 블록을 훔쳐올 수 있다(BMB Stealing).
이 경우 프리 블록을 다른 노드로부터 전송 받아야 하므로 gc current block 2/3-way 이벤트를 대기한 것으로 관찰될 수도 있다.
문서에 대하여
- 최초작성자 : 김종원
- 최초작성일 : 2011년 03월 25일
- 이 문서는 오라클클럽 코어 오라클 데이터베이스 스터디 모임에서 작성하였습니다.
- {*}이 문서의 내용은 (주)엑셈에서 출간한 'RAC Advanced OWI, Internals and Performance in Oracle 10g'를 참고하였습니다.*