Enq: HW - contention

EXEM Knowledge Base

Jump to: navigation, 찾기

목차

[편집] Basic Info

HWM(High Water Mark)을 여러 프로세스가 동시에 변경하는 것을 막기 위한 락을 HW 락이라고 부른다. HWM을 이동시키고자 하는 프로세스는 반드시 HW 락을 획득해야 한다. HW 락을 획득하는 과정에서 경합이 발생하면 enq: HW - contention 이벤트를 대기한다. HW 락 경합은 대부분 대량 Insert에 의해 발생하며, 간혹 대량 Update에 의해 언두 세그먼트에서 HW 락 경합현상이 발생하는 경우도 있다. Update의 경우 테이블 세그먼트의 추가확장은 크지 않지만 언두 데이터를 생성하는 과정에서 언두 세그먼트의 급속한 확장이 필요하기 때문이다. HW 락 경합은 세그먼트의 급속한 공간확장이 필요한 경우에 매우 보편적으로 나타나는 대기현상이며, 극단적인 성능 저하를 야기하는 경우도 종종 발생한다.

[편집] Parameter & Wait Time

[편집] Wait Parameters

enq: HW - contention 대기이벤트의 대기 파라미터는 다음과 같다.

  • P1 : Enqueue 정보
  • P2 : Tablespace#
  • P3 : Segement Header Block#

[편집] Wait Time

enqueue 대기이벤트와 동일하다. 최대 3초까지 기다린다. 만일 HW 락을 획득하기 못하면 획득할 때까지 대기한다.

[편집] Check Point & Solution

[편집] FLM을 사용하는 경우

FLM(Free List Management)을 사용하는 경우에 HW 락 경합이 특히 자주 관찰된다. FLM을 사용하는 경우 기본 설정 값이 대량의 Insert 작업에는 적합하지 않기 때문이다. FLM 환경에서 HW 락 경합을 줄이는 방법은 다음과 같다.

첫째, Storage 속성의 FREELISTS 속성 값(기본 값은 1)을 동시 트랜잭션의 수를 고려해서 충분히 크게 잡아준다. FLM에서 발생하는 많은 성능 문제가 잘못된 FREELISTS 속성 값에 기인한다. FREELISTS 값이 크면 HWM 이동 시에 할당 받는 블록의 수가 늘어나기 때문에 그만큼 HW 락의 경합이 줄어드는 효과가 있다.

둘째, _BUMP_HIGHWATER_MARK_COUNT 히든 파라미터의 값을 크게 설정한다. _BUMP_HIGHWATER_MARK_COUNT 값은 하나의 프리리스트당 HWM을 이동하는 크기를 결정한다. 가령 FREELISTS 값이 10이고 _BUMP_HIGHWATER_MARK_COUNT 값이 20이라면 한번에 200 블록(10*20)만큼 HWM이 이동하게 된다.

셋째, 적절한 크기의 익스텐트를 사용한다. 익스텐트의 크기가 작으면 HWM의 이동 시에 익스텐트 추가 할당 작업이 빈번하게 발생하고 HW 락을 보유하는 시간 또한 길어지기 때문이다. 따라서 트랜잭션의 크기를 고려해서 익스텐트의 크기를 적절하게 설정하는 것이 중요하다. 대부분의 경우 Extent Management Local Uniform Size 5M 정도의 설정 값을 권고하고 있다.

[편집] ASSM을 사용하는 경우

ASSM(Automatic Segment Space Management)을 사용하는 경우에는 HW 락 경합이 크게 문제가 되지 않는다. ASSM의 개선된 세그먼트 관리 기법으로 인해 FLM을 사용할 때와 같은 성능 문제가 생기지 않기 때문이다. 설령 HW 락 경합이 발생해서 문제가 되더라도 튜닝할 수 있는 요소는 거의 없다. ASSM 관리 기법에서는 거의 모든 것이 자동화되어 있어서 만일 ASSM을 사용하는 세그먼트에서 HW 락 경합으로 인해 enq: HW - contention 이벤트가 발생한다면 익스텐트(Extent)의 크기를 늘리는 방법을 시도해본다. 또한 미리 익스텐트를 할당 받아두는 것도 좋은 방법이다. 익스텐트 크기가 크고, 큰 크기의 익스텐트를 미리 할당한 경우에는 HWM을 이동할 때의 오버헤드가 그만큼 줄어들기 때문이다.

[편집] Event Tip

[편집] 세그먼트, 익스텐트, HWM의 개념

오라클은 세그먼트라는 개념을 이용해 데이터베이스 공간(Space)를 관리한다. 따라서 오라클 공간과 관련된 성능 문제를 이해하려면 세그먼트 관리 기법에 대해 어느 정도의 지식이 필요하다.

세그먼트(Segment)는 테이블, 인덱스, 언두, LOB 등 오라클이 제공하는 모든 종류의 논리적인 공간을 말한다. 세그먼트는 다시 익스텐트(Extent)라는 논리적인 요소로 나누어지는데 익스텐트는 데이터 추가에 따른 세그먼트 공간의 확장을 담당하는 역할을 한다. 가령, 세그먼트의 기존 여유공간이 다 소모된 상태에서 추가적인 Insert가 발생하면 오라클은 익스텐트를 추가로 할당해서 데이터를 저장한다. 익스텐트는 블록(Block)이라는 연속적인 물리적 조각으로 이루어진다. 하나의 익스텐트는 보통 여러 개의 블록으로 이루어진다. 블록은 오라클의 물리적/논리적 IO의 최소 단위이다.

오라클이 익스텐트에 의해 신규로 할당된 모든 공간을 다 실제로 사용중인 것은 아니기 때문에, 사용된 공간과 아직 사용되지 않은 공간을 구분하는 표식을 필요로 한다. 이 표식을 고수위선(High Water Mark. 이하 HWM)이라고 부른다. HWM은 세그먼트 헤더 블록에 그 정보가 저장된다.

세그먼트, 익스텐트, 블록, HWM의 개념을 이해하기 위해 예를 들어 설명해보자.

현재 총 500 블록이 할당되어 있으며 모든 블록들을 사용 중인 테이블(세그먼트)에 1건의 로우를 추가로 Insert 한다고 하자. 사용 가능한 공간이 없으므로 프로세스는 익스텐트를 추가로 할당해야 한다. DMT(Dictionary Managed Tablespace)를 사용하는 경우에는 ST 락을 획득한 후에만 익스텐트 할당 작업이 가능하다. ST 락을 획득하는 과정에서 경합이 발생하면 enq: ST - contention 이벤트를 대기한다. ST 락 경합은 오라클 9i 이후로는 거의 발생하지 않는다. 익스텐트가 추가로 할당되고 이에 따라 총 50 블록(1 익스텐트 = 50 블록이라고 가정)이 세그먼트에 추가된다. 50개의 블록 중에서 오라클은 몇 개의 블록(여기서는 5개라고 가정)만을 포맷(Format)하고 사용가능공간으로 등록한다. 즉, 전체 550 블록 중 Used Block = 500 + 5 = 505, Unused Block = 45 가 된다. 이러한 기준을 오라클에서는 HWM이라고 부른다. 즉, HWM은 세그먼트의 전체 공간 중 사용가능 공간(포맷된 공간)과 미사용 공간(미포맷 공간)을 구분하는 기준이 된다. 만일 추가로 계속해서 Insert 가 이루어져서 포맷된 5개의 블록을 다 소진하게 되면 추가로 5개의 블록을 포맷하고 이를 사용가능공간으로 전환하고 HWM을 이동하게 된다. HWM을 이동하는 작업은 HW 락을 통해 보호된다. HWM을 이동하고자 하는 프로세스는 반드시 세그먼트에 대해 HW 락을 획득해야 한다. HW 락을 획득하는 과정에서 경합이 발생하면 enq: HW - contention 이벤트를 대기한다. 동시에 여러 세션이 동일 세그먼트에 대해 대량의 데이터를 추가하는 경우 잦은 HWM 이동에 의해 HW 락 경합현상이 광범위하게 발생할 수 있다. HWM의 이동은 하나의 익스텐트가 모두 사용될 때까지 계속된다. 만일 하나의 익스텐트를 다 사용하게 되면 오라클은 추가적으로 다시 익스텐트를 할당한다.

오라클이 제공하는 세그먼트 공간관리기법은 FLM(수동관리)과 ASSM(자동관리)로 나뉜다. 테이블스페이스 생성시 부여하는 segment space management 속성에 의해 FLMASSM의 사용여부가 결정된다.

[편집] Analysis Case