Gc current split

EXEM Knowledge Base

Jump to: navigation, 찾기

목차

[편집] Basic Info

gc current split 이벤트는 gc cr/current request 이벤트에 대한 Fixed-up 이벤트로, 홀더 노드가 인덱스 블록을 전송하는 과정에서 인덱스 분할(Index Split)이 발생했음을 의미한다. gc cr/current request 이벤트가 gc current split 이벤트로 변경되는 흐름은 다음과 같다.

요청 노드의 유저 프로세스가 특정 인덱스 블록을 읽고자 한다.

  • 유저 프로세스는 해당 블록의 적절한 버전이 로컬 버퍼 캐시에 없는 것을 확인하고, 마스터 노드의 LMS 프로세스에 블록 전송을 요청한다. 유저 프로세스는 응답을 받을 때까지 gc current request 이벤트를 대기한다.
  • 홀더 노드의 LMS 프로세스가 해당 인덱스 블록에 대해 락을 획득하려고 하는 시점에 인덱스 분할(Index Split)이 발생하고 있다면, 인덱스 분할이 끝날 때까지 대기해야 한다. 인덱스 분할이 끝나고 나면 홀더 노드는 해당 블록과 함께 인덱스 분할이 발생했음을 나타내는 메시지를 함께 전송한다.
  • 유저 프로세스는 블록을 전송 받은 후 응답 메시지로부터 전송 과정에서 인덱스 분할이 발생 중임을 확인하고, gc cr/current request 이벤트를 Fixed-up 이벤트인 gc current split 이벤트로 변경한다.

gc current split 이벤트는 루트 노드, 브랜치 노드, 리프 노드 블록에 무관하게 해당 블록이 인덱스 분할을 위해 블로킹되고 있는 상황에서는 공통적으로 발생할 수 있다. 특정 리프 노드를 분할하는 과정에서는 그 부모 노드의 블록도 변경이 금지되기 때문이다.

gc current split 이벤트와 관련 있는 또 하나의 대기 이벤트는 enq: TX – index contention 이벤트이다. 테이블의 특정 로우를 변경하고자 하는 프로세스는 만일 관련된 인덱스 블록이 다른 프로세스에 의해 분할되고 있다면, 인덱스 분할이 완료될 때까지 기다려야 한다. 이때 대기하는 이벤트가 enq: TX – index contention 이벤트이다. 아래 결과는 여러 프로세스에 의한 동시 INSERT 작업에 의한 인덱스 분할이 자주 발생하는 작업 하에서 SQL Trace를 이용해 특정 프로세스의 대기 현상을 캡쳐한 것으로 gc current split 이벤트와 함께 enq: TX – index contention 이벤트가 관찰되는 것을 확인할 수 있다.

WAIT #9: nam='gc current split' ela= 140584 p1=14 p2=28311 p3=33554433
WAIT #9: nam='enq: TX - index contention' ela= 5478 p1=141505 p2=32737 p3=6585
…
WAIT #9: nam='gc current split' ela= 66390 p1=14 p2=28410 p3=33554433
WAIT #9: nam='enq: TX - index contention' ela= 1343 p1=141505 p2=33420 p3=6576
…
WAIT #9: nam='gc current block 2-way' ela= 1139 p1=14 p2=28421 p3=33554433
WAIT #9: nam='enq: TX - index contention' ela= 163 p1=141505 p2=33424 p3=6576
…

[편집] Parameter & Wait Time

[편집] Wait Parameters

gc current split 이벤트와 같은 Fixed-up 이벤트는 P1, P2, P3 값이 별도로 부여되지 않으며, Placeholder 이벤트(여기서는 gc cr request 이벤트)와 동일한 값을 가지는 것으로 해석하면 된다.

[편집] Wait Time

[편집] Check Point & Solution

[편집] gc current split의 해결

Fixed-up 이벤트로 gc current split 이벤트가 많이 목격된다는 것은 동일 테이블 블록에 대한 인덱스 분할이 과도하게 발생한다는 것을 의미한다. 이 이벤트에 대한 대기를 해소하는 기법은 enq: TX – index contention 이벤트를 해소하는 기법과 동일하다.

시퀀스 값을 사용해서 인덱스 키를 생성하는 경우에는 가장 오른쪽 리프 블록에 삽입이 집중되어 인덱스 분할에 의한 경합이 많이 발생한다. 이 경우에는 다음과 같은 기법을 적용할 수 있다.

  1. 인덱스 키 조합을 변경하여 우편향(Right-hand) 현상을 해소할 수 있다.
  2. 시퀀스의 캐시 크기를 증가시킨다. 시퀀스의 캐시 크기가 크면 각 노드에서 사용하는 시퀀스의 값 집합이 큰 차이를 보이기 때문에 동일한 인덱스 리프 블록에 대한 경합이 줄어든다.
  3. 인덱스 블록의 블록 크기를 키우는 방법도 사용 가능하다. 블록 크기가 크면 그만큼 인덱스 분할이 덜 발생하기 때문이다. 하지만 블록 크기는 여러 가지 상황을 고려한 후 결정해야 하는 사안이므로 신중히 접근해야 한다. 블록의 크기가 커지면 인덱스 분할 회수는 줄일 수 있지만 버퍼 락에 의한 경합은 증가하는 경향이 있기 때문이다.

[편집] Event Tip

[편집] Analysis Case