1. latch: redo writing

1) 이벤트 원인

  • 리두 버퍼내의 공간을 확보하기 위해 LGWR에게 쓰기 요청을 하려는 프로세스는 'redo writing' 래치를 획득해야 함.
  • LGWR에 의한 쓰기 작업은 동시에 수행될 수 없으므로, 자연스럽게 이 래치는 전체 인스턴스에 하나만 존재함.
  • 'redo writing'는 독립 래치(solitary latch)이기 때문에 'V$LATCH_PARENT' 동적 뷰를 통해 확인 가능
  • 'redo writing' 래치는 'Willing-to-wait' 모드로 획득되며, 경합이 발생할 경우 이 이벤트를 대기함

SELECT NAME,
       GETS,
       MISSES,
       IMMEDIATE_GETS,
       IMMEDIATE_MISSES,
       WAIT_TIME
FROM   V$LATCH_PARENT
WHERE  NAME = 'redo writing'
;

NAME             GETS     MISSES IMMEDIATE_GETS IMMEDIATE_MISSES  WAIT_TIME 
-------------- ------ ---------- -------------- ---------------- ---------- 
redo writing   271153       1738              0                0        968 

2. latch: redo copy

  • PGA 내의 체인지 벡터를 리두 버퍼로 복사하려는 프로세스는 작업의 전체과정 동안 'redo copy'를 획득해야 함.
  • 'redo copy' 래치 수는 '_LOG_SIMULTANEOUS_COPIES'라는 히든 파라터의 값에 의해 결정되며, 기본값은 CPU의 2배임

SELECT A.KSPPINM  NAME,
       B.KSPPSTVL VALUE,
       B.KSPPSTDF DEF_YN,
       A.KSPPDESC DESCRIPTION
FROM   X$KSPPI  A,
       X$KSPPSV B
WHERE  A.INDX = B.INDX
AND    LOWER(A.KSPPINM) IN (TRIM(LOWER('_log_simultaneous_copies'))
                            )
ORDER  BY 1
;

NAME                     VALUE DEF_YN DESCRIPTION                                                       
------------------------ ----- ------ ------------------------------------------------------------------
_log_simultaneous_copies 48    TRUE   number of simultaneous copies into redo buffer(# of copy latches)           

  • 'V$LATCH_CHILDREN' 뷰를 통해 'redo copy' 래치 활동 파악 가능

SELECT NAME,
       GETS,
       MISSES,
       IMMEDIATE_GETS,
       IMMEDIATE_MISSES,
       WAIT_TIME
FROM   V$LATCH_CHILDREN
WHERE  NAME = 'redo copy'
;

NAME             GETS     MISSES IMMEDIATE_GETS IMMEDIATE_MISSES  WAIT_TIME
---------- ---------- ---------- -------------- ---------------- ----------
redo copy        3250          0              0                0          0
redo copy        3250          0              0                0          0
redo copy        3250          0              0                0          0
redo copy        3250          0              0                0          0
redo copy        3250          0              0                0          0
redo copy        3250          0              0                0          0
redo copy        3250          0              0                0          0
redo copy        3250          0              0                0          0
redo copy        3250          0              0                0          0
redo copy        3250          0              0                0          0
redo copy        3250          0              0                0          0
redo copy        3250          0              0                0          0
redo copy        3250          0              0                0          0
redo copy        3250          0              0                0          0
redo copy        3250          0              0                0          0
redo copy        3250          0              0                0          0
redo copy        3250          0              0                0          0
redo copy        3250          0              0                0          0
redo copy        3250          0              0                0          0
redo copy        3250          0              0                0          0
redo copy        3250          0           3948                1          0
redo copy        3250          0           7356                3          0
redo copy        3250          0           4616                6          0
redo copy        3250          0           6312                6          0
redo copy        3250          0           5899                6          0
redo copy        3250          0           7723                9          0
redo copy        3250          0           9164               11          0
redo copy        3250          0          20299               19          0
redo copy        3250          0          25901               15          0
redo copy        3250          0          15568               15          0
redo copy        3250          0          20369               21          0
redo copy        3250          0          27109               37          0
redo copy        3250          0          24926               27          0
redo copy        3250          0          48979               35          0
redo copy        3250          0          27933               36          0
redo copy        3250          0          24279               35          0
redo copy        3250          0          17672               38          0
redo copy        3250          0          58922               69          0
redo copy        3250          0          20380               47          0
redo copy        3250          0          74721               68          0
redo copy        3250          0          84075               69          0
redo copy        3250          0          52340               74          0
redo copy        3250          0          56953               92          0
redo copy        3250          0          57725              107          0
redo copy        3250          0         914649              491          0
redo copy        3250          0         122597              138          0
redo copy        3250          0         787318              503          0
redo copy        3250          0        2640789              286          0

  • 'redo copy' 래치는 기본적으로 'No-wait' 모드로 획득하며, 'IMMEDIATE_GETS' 값이 높은 이유이기도 함.
  • 'No-wait' 모드로 래치를 계속 시도한 후, 얻지 못할 경우 'Willing-to-wait' 모드로 작동되며, 이 때 경합이 발생하면 'latch: redo copy' 이벤트를 대기함

3. latch: redo allocation

1) 오라클 버전별 비교

8i☞ 체인지 벡터를 리두 버퍼에 복사하기 위해 리두 버퍼에 공간을 확보하는 과정에서 'redo allocation' 래치를 획득함.
☞ 8i까지는 전체 인스턴스에서 하나의 'redo allocation' 래치만이 사용가능하며, 이로 인해 경합에 의한 성능저하 빈번함.
9i☞ 9i부터는 전체 리두 버퍼를 복수개의 'redo strands'라는 공간으로 분할해서 사용할 수 있으며, 하나의 'redo strands'가 하나의 'redo strands'를 관리함.
☞ 복수개의 'redo strands' 래치를 사용하기 때문에 경합을 다소 줄일 수 있으며, 'redo strands' 개수는 'LOG_PARALLELISM' 파라미터로 결정되고, 기본값은 1
☞ 10g에서는 이 파라미터를 '_LOG_PARALLELISM' 히든 파라미터로 변경하였으며, 오라클에서는 이 파라미터값을 (CPU 개수 / 8) 만큼 변경시킬 것을 권고함
10g☞ 10g부터는 'Dynamic Paralleism'이라는 새로운 기능을 도입하였으며, '_LOG_PARALLELISM' 값을 TRUE로 할 경우 활성화되고 기존값은 TRUE임.
☞ 이 기능은 'redo strands' 개수를 동적으로 관리하며, 생성 가능한 최대 개수는 10g R2부터 '18 + _LOG_PARALLELISM_MAX'이고 이 값 만큼 'redo allocation' 래치 생성.
☞ '_LOG_PARALLELISM_MAX' 기본값은 2이며, CPU 개수는 초과 불가함.

2) private redo strands

  • 일반적으로 리두 데이터를 생성하기 위해, 체인지 벡터를 PGA에 생성한 후 필요한 래치를 확보하고, 리두 버퍼에 복사하는 과정을 거침.
  • 하지만 'private redo strands'는 리두 레코드가 'Shared Pool' 내의 'private strands' 영역에 생성됨.
  • 'private strands' 영역은 프로세스간에 공유되지 않기 때문에, 리두 생성 시 래치 획득이 필요 없으며, LGWR에 의해 리두 로그 파일로 바로 쓰여지므로 PGA에서 리두 버퍼로 복사하는 과정 불필요('zero copy redo'라고 함)

SELECT *
FROM   V$SGASTAT
WHERE  NAME LIKE '%strand%'
;

POOL         NAME                    BYTES
------------ ------------------ ----------
shared pool  private strands     145305600


3) 리두 관련 경합 발생 시 조치 방법

① 시스템 전체 대기이벤트 목록에서 이 래치 대기가 상위를 차지할 경우, 경합인지 확인하는 방법
  • 메타링크 문서번호 '14747.1'에 의하면 'msiies / gets' 값이 1% 이상이거나 'miiediate_misses / (immediate_gets + immediate_misses)' 값이 1% 이상이면 경합으로 판단함.
② 리두 버퍼의 크기가 작을 경우 경합 발생됨
  • 지나치게 작은 경우 LGWR의 백그라운드 기록 작업이 빈번하게 발생되는데, 기록을 위해서는 리두 관련 래치들을 획득해야 하므로 래치 경합 증가함.
  • 리두 관련 경합이 빈번할 경우 리두 버퍼 크기를 살펴본 후 크기를 증가시킴
③ 'Nologging' 기능 활용
  • 시스템 전체적으로 불필요하게 많은 리두 데이터가 생성된다면, 'Nologging' 기능을 활용하여 래치 경합을 줄일 수 있음.

문서에 대하여