VIII. buffer busy waits
1) Event 정의
- Buffer가 Busy (Incompatible) 하여 Buffer Lock을 획득하지 못하여 대기하는 이벤트
- P1 = file# (v$datafile의 file#)
- P2 = block# (데이터 파일에서의 블록 위치)
- P3 = block class#. 가장 중요한 정보 (10gR1이전버전에서는 reason code)
2) 대기발생 사유
- Buffer에 Cache된 Block의 내용을 읽거나 수정할 경우 Buffer Lock 을 획득해야 함
- 동시에 여러 Session이 Buffer내의 다른 Record를 수정하고자 하는 경우 Row Level Lock (TX) 경합은 발생하지 않지만 Buffer Lock 경합은 발생 가능
3) Block Class (P3)
Block Class# | 내용 | Block Class# | 내용 |
---|
1 | Data block | 9 | 2nd level bmb |
2 | Sort block | 10 | 3rd level bmb |
3 | Save undo block | 11 | Bitmap block |
4 | Segment header | 12 | Bitmap index block |
5 | Save undo header | 13 | File header block |
6 | Free list | 14 | Unused |
7 | Extent map | 15+2r | Undo Header block (r=0, system undo header) |
8 | 1st level bmb | 16+2r | Undo block (r=0, system undo) |
블록 클래스는 이벤트를 분석하는데 매우 중요한 지표이다.
블록의 클래스를 분석함으로써 경합의 원인을 직감적으로 알 수 있고 성능 튜닝의 방향을 잡을 수 있기 때문이다.
4) Data Block (Class=1)에 대한 경합
- 동일 블록 변경에 의한 Data Block에 대한 경합
동일 블록 변경에 의한 데이터 블록에 대한 경합
- 동일한 블록의 서로 다른 로우를 동시에 변경할 경우 버퍼 락에 의한 buffer busy waits 이벤트가 발생한다.
- 하나의 로우를 변경을 하기 위해서는 그 로우를 포함하고 있는 블록 전체에 exclusive모드로 버퍼 락을 획득해야 한다.
슬라이드 내용
- 프로세스1이 업데이트 작업으로 블록에 버퍼 락을 획득한다.
- 프로세스2~5 까지 대상 블록의 버퍼 락을 획득하기 위해 buffer busy waits 이벤트를 대기하게 된다.
- 프로세스1의 작업이 끝나게 되면 획득하고 있던 버퍼 락을 해제한다.
- 먼저 대기하고 있던 프로세스2가 버퍼 락을 획득하고 블록의 원하는 로우를 변경한다.
- Consistent Read에 의한 Undo 영역 경합
- 언두 헤더 경합
- 한 프로세스가 블록을 변경하게 되면 변경되기 전의 블록은 언두 영역에 저장되게 된다.
- 언두 헤더를 변경하기 위해 언두 헤더에 버퍼 락을 exclusive 모드로 획득하고 언두 블록을 생성한다.
- 이때 update 세션의 언두 헤더 변경 작업과 select 세션의 의한 언두 헤더 블록 읽기 작업간의 버퍼 락 경합에 의해 발생한다.
- 언두 블록 경합
- 다른 프로세스들이 select 작업에서 각자의 일관성 읽기를 위해 각자의 SCN에 맞는 CR 블록을 생성해야 한다.
- CR 블록을 생성하기 위해 언두 블록을 불러오게 되고 이 때 언두 블록에 대해 동시에 많은 세션들이 읽기를 시도하면서 언두 블록에 대한 버퍼 락 경합이 발생되고 이로 인해 read by other session 대기 이벤트가
- FLM을 사용할 경우 Free List 변경에 따른 경합
슬라이드 내용
- FREELISTS 속성값이 1일 경우 여러 프로세스가 하나의 프리리스트로부터 프리 블록을 할당 받는다.
- 여러 개의 프로세스가 동시에 insert 작업을 할 경우 하나의 프리 리스트에서 프리 블록을 할당 받아 해당블록에 데이터를 추가하려고 한다.
- 이 과정에서 같은 세그먼트 헤더 블록 버퍼에 대해 exclusive하게 버퍼 락을 획득하기 위한 경합이 이루지고 buffer busy waits 대기 이벤트가 발생된다.
클래스가 4인 경우는 세그먼트 헤더 블록에 해당한다, Insert를 수행하면서 세그먼트 헤더를 변경하는 것은 프리 리스트 정보를 변경하거나 HWM(high water mark)을 변경하기 위한 것이다. HWM을 변경하는 과정에서는 enq: HW - contention 대기와 같이 발생된다.
7) BMB (Class = 8,9,10) (L1 BMB, L2 BMB, L3 BMB)에 대한 경합
- ASSM(Auto Segment Space Management)을 사용하는 경우
슬라이드 내용
- ASSM이란 프리 리스트 대신 3단계 형태의 비트맵 블록(BMB, bitmap block)들에 의해서 세그먼트 공간을 관리하는 방법이다.
- ASSM을 사용하는 경우에는 데이터 블록보다는 세그먼트 공간 관리에 사용되는 비트맵 블록에 대한 버퍼 락 경합이 주로 발생한다.
- L1 BMB는 공간관리를 위한 최하위의 리프 블록으로 블록의 상태가 바뀜에 따라 많은 변경이 발생하게 되므로 L1 BMB에서 주로 buffer busy waits 대기가 발생하게 된다.
- ASSM을 사용하게 되면 buffer busy waits 대기와 enq: HW - contention 대기가 모두 줄어든다.
8) Block Class# 따른 경합 분석
- Data Block (Block Class# = 1)에 대한 경합 (code 220)
- Transaction을 최대한 여러 Block으로 분산
- Partitioning
- Block당 Record 수 최소화(높은 PCTFREE)
- Small Block Size (2K)의 Tablespace 사용 (9i~)
- Data Segment Header (Block Class# = 4)에 대한 경합 (code 220)
- Segment의 Freelists 와 Freelist Groups 증가(FLM을 사용하는 경우)
- Next Extent의 크기가 작은 경우 증가
- Undo Segment Header (Block Class# = 17)에 대한 경합
- AUM (Automatic Undo Management) 사용 고려
- Data Block (Block Class# = 1 )에 대한 경합
- 동시성 레벨을 낮추거나 파티셔닝 기법으로 변경
- 블록당 레코드 수를 최소화
- 작은 블록 사이즈를 가진 다른 테이블 스페이스로 오브젝트 이동(9i~)
- Data Segment Header (Block Class# = 4)에 대한 경합
- 오브젝트의 FREELISTs 와 FREELIST GROUPS의 수를 증가
- Next extent의 크기를 적당한 크기로 증가
- Undo Segment Header (Block Class# = 15 + 2r)에 대한 경합
- AUM(Automatic Undo Management)를 사용하면 해결가능
- Private rollback segment 사용시 롤백 세그먼트당 트랜잭션의 수를 감소
- Public rollback segment 사용시 TRANSACTIONS_PER_ROLLBACK_SEGMENT의 수치를 감소
- Undo Block (Block Class# = 16+2r)에 대한 경합
- 어플리케이션에서 각각 다른 시점에 쿼리와 DML을 수행하게 조절
9) buffer busy waits 관련 view
- X$KCBWAIT (kernel cache buffer wait) - V$WAITSTAT의 근간
- X$KCBFWAIT (kernel cache buffer file wait)
- X$KCBWDS (bbwait column)
- Cache buffers lru chain latch 별로 경합을 확인
- X$KSOLSFTS (fts_stmp column)? V$SEGMENT_STATISTICS의 근간
- 특정 Segment에 대해 buffer busy waits 가 발생한 최근 시간을 저장
- V$SEGMENT_STATISTICS View가 사용하기 편함
- V$SYSTEM_EVENT
문서에 대하여
- 최초작성자 : 황종필
- 최초작성일 : 2010년 09월 18일
- 이 문서는 오라클클럽 코어 오라클 데이터베이스 스터디 모임에서 작성하였습니다.
- {*}이 문서의 내용은 (주)엑셈에서 출간한 'PRACTICAL OWI IN ORACLE 10G'를 참고하였습니다.*