Gc buffer busy
EXEM Knowledge Base
목차 |
[편집] Basic Info
gc buffer busy 이벤트는 로컬 프로세스가 읽고자 하는 블록이 현재 리모트 노드의 요청에 의해 사용 중임을 의미하는 이벤트이다. gc buffer busy 이벤트는 Placeholder/Fixed-up의 분류의 따르지 않는 독립 이벤트이다.
gc buffer busy 이벤트는 buffer busy waits 이벤트나 read by other session 이벤트의 글로벌 버전으로 이해하면 된다. 서버 프로세스가 특정 블록을 사용하고자 하는 시점에 버퍼 락 경합이 발생하면 대기하게 되는데, 그 발생 사유에 따라 이들 대기 이벤트들 중 하나를 사용하게 된다.
[편집] Parameter & Wait Time
[편집] Wait Parameters
gc buffer busy 이벤트의 대기 파라메터는 다음과 같다.
P1 : file# P2 : Block# P3 : id
자세한 정보는 Gc_cr/current_request#Wait_Parameters를 참조한다.
[편집] Wait Time
[편집] Check Point & Solution
[편집] gc buffer busy의 해결
버퍼 락 경합의 발생 사유와 해당 대기 이벤트를 정리하면 다음과 같다.
같은 인스턴스의 다른 프로세스가 해당 블록을 변경 중일 때는 변경이 완료될 때까지 buffer busy waits 이벤트를 대기한다.
- 같은 인스턴스의 다른 프로세스가 해당 블록을 디스크에서 읽어 들이는 중일 때는 I/O 작업이 완료될 때까지 read by other session 이벤트를 대기한다. I/O 작업을 수행하는 프로세스는 db file sequential read 이벤트나 db file scattered read 이벤트를 대기한다.
- 같은 인스턴스의 다른 프로세스가 해당 블록을 다른 인스턴스로부터 전송 받고 있는 중이라면 전송이 끝날 때까지 gc buffer busy 이벤트를 대기한다.
- 다른 인스턴스의 요청에 의해 해당 블록이 전송 중이라면, 전송이 끝나고 사용이 완료될 때까지 gc buffer busy 이벤트를 대기한다.
gc buffer busy 이벤트의 근본적인 발생 원인은 buffer busy waits 이벤트와 동일하며, 해결책 또한 동일하다. gc buffer busy 이벤트의 발생 원인과 해결책을 정리하면 아래와 같다.
- 핫 블록이 gc buffer busy 이벤트 발생의 가장 일반적인 원인이다. 따라서 문제가 되는 핫 블록을 분산시킴으로써 문제를 해결할 수 있다. 세그먼트 레벨의 파티셔닝 적용, 우편향 인덱스 현상의 해소, 시퀀스 캐시 크기의 증가, PCTFREE의 증가 등이 보편적으로 사용되는 방법이다.
- FLM을 사용하는 경우에는 세그먼트 헤더 블록이 버퍼 경합의 원인이 될 수 있다. 다행히 오라클 10g R2부터는 ASSM이 기본적으로 사용되기 때문에 FLM 환경에서 발생하는 성능 문제가 크게 줄어든다. 만일 FLM을 사용하는 환경이라면, 반드시 FREELIST GROUPS 속성을 노드 수와 동일하게 설정해서 세그먼트 헤더 블록의 경합을 최소화해야 한다.
- SQL 튜닝을 통해 불필요하게 많은 블록이 교환되는 것을 줄인다.
- 동일한 세그먼트에 대한 대량의 DML 작업이 여러 노드에서 동시 다발적으로 발생하면 광범위한 버퍼 락 경합이 발생할 수 있다. 어플리케이션 실행을 적절히 분배하는 것이 해결 방법이다.