[캐시 퓨전 #5] 커밋된 블록 UPDATE 시에 발생하는 gc cr/current block 2-way, 3-way 대기이벤트에 대한 이해

1. 테스트 개요


2번 노드에서 레코드 1건 (마스터 노드: 3번)을 변경한 후 커밋을 수행합니다. 그런 후에 해당 블록 내의 각기 다른 레코드를 1번 및 3번 노드에서 변경합니다. 이를 통해, 커밋된 블록을 변경할 때 발생하는 gc cr block 2-way, gc cr block 3-way, gc current block 2-way, gc current block 3-way 대기이벤트의 동작원리를 파악하도록 합니다.

2. 2번 노드에서 1건 UPDATE 및 COMMIT 수행


2번 노드에서 1건을 변경하면 해당 블록에 대한 XCUR 버퍼 및 CR 버퍼가 캐시에 적재됩니다. (그림-1 참조) 이때 발생하는 변경 사항은 아래의 테스트 결과 중간중간에 주석으로 설명해 두었습니다. (테스트 수행 전에 버퍼 캐시를 flush합니다)

그림-1. 2번 노드에서 1건 UPDATE 및 COMMIT 수행 후의 변경 내용

25-1

-- 해당 블록은 로컬 및 리모트 캐시에 존재하지 않으므로 3번 노드의 LMS로부터 블록 액세스 권한을 부여 받습니다.
-- 이로 인해 'gc cr grant 2-way' 대기이벤트가 1회 발생합니다. 

-- 그런 후에, 싱글 블록 IO를 이용해서 해당 블록(File#=6, Block#=228)을 메모리로 적재합니다.
-- 이때 'db file sequential read' 대기이벤트가 1회 발생합니다.

-- 해당 블록을 적재한 후에는 해당 블록을 변경하기 위한 CURRENT 권한을 부여 받아야합니다.
-- 이로 인해 'gc current grant 2-way' 대기이벤트가 1회 발생합니다.

-- 또한, 변경 작업을 위한 언두 블록을 할당 받기 위해 'db file sequential read' 대기이벤트가 2회 발생합니다.
-- 블록 덤프를 수행해보면 각각 언두 헤더 블록과 언두 블록임을 알 수 있습니다. 

-- 마지막으로 커밋 수행에 따른 'log file sync' 대기이벤트가 1회 발생합니다.

SCOTT@OOW2:2> @set_trace_on 10046 8
SCOTT@OOW2:2> @one_row_update1 

WAIT #140225505518032: nam='gc cr grant 2-way' ela= 1694 p1=6 p2=228 p3=1 obj#=93973 tim=310683117658
WAIT #140225505518032: nam='db file sequential read' ela= 1004 file#=6 block#=228 blocks=1 obj#=93973 tim=310683118769
WAIT #140225505518032: nam='gc current grant 2-way' ela= 1585 p1=6 p2=228 p3=33619969 obj#=93973 tim=310683120612
WAIT #140225505518032: nam='db file sequential read' ela= 4967 file#=5 block#=208 blocks=1 obj#=0 tim=310683125736
WAIT #140225505518032: nam='db file sequential read' ela= 4138 file#=5 block#=3097 blocks=1 obj#=0 tim=310683130557

WAIT #140225502776168: nam='log file sync' ela= 3259 buffer#=3054 sync scn=12152221 p3=0 obj#=0 tim=310702054641

SYS@OOW2:2> alter system dump datafile 5 block 208;
frmt: 0x02 chkval: 0xbae3 type: 0x26=KTU SMU HEADER BLOCK

SYS@OOW2:2> alter system dump datafile 5 block 3097;
frmt: 0x02 chkval: 0xfdae type: 0x02=KTU UNDO BLOCK

-- V$SESSTAT 뷰의 변경 사항 (참고만 하세요)

SYS@OOW1:1> @init_temp_sesstat 91 65 43
SYS@OOW1:1> @get_temp_sesstat  91 65 43

INST_ID SERVER FLAG     NAME                           VALUE
------- ------ -------- ------------------------------ -----
      2 [FG]   [EVENT]  db file sequential read            3
                        gc cr grant 2-way                  1
                        gc current grant 2-way             1
               [STAT]   physical reads                     3
                        session logical reads              3

-- 2번 노드에 XCUR 버퍼 1개와 CR 버퍼 1개가 적재되었습니다.
-- 그리고 2번 노드의 GRD에 GCS 클라이언트 (락 엘리먼트 존재)가 1개 생성되고
-- 마스터 노드인 3번 노드에 GCS SHADOW가 1개 생성되었습니다.

SYS@OOW1:1> @fnd_gcs_detail2 6 228

                        X$BH X$BH   X$BH                   X$BH
INST ADDR              CLASS STATE  LE_ADDR                 TCH BA
---- ---------------- ------ ------ ---------------- ---------- ----------------
OOW2 00007F79DD4D06B0      1 CR     00                        0 0000000073540000
     00007F79DD4D0830      1 XCUR   00000000753FD2B0          2 0000000073A8E000

     X$KJBL           X$KJBL X$KJBL    X$KJBL     X$BH               X$BH X$BH
INST LOCKP             OWNER GRANT     LOCKST     LE_ADDR           CLASS STATE
---- ---------------- ------ --------- ---------- ---------------- ------ ------
OOW2 00000000753FD338      1 KJUSEREX  GRANTED    00000000753FD2B0      1 XCUR
OOW3 00000000696D69C0      1 KJUSEREX  GRANTED

3. 1번 노드에서 동일 블록 내의 다른 레코드 UPDATE 및 COMMIT 수행


1번 노드에서 동을 블록 내의 다른 레코드를 변경하면 2번 노드의 XCUR 버퍼는 PI 버퍼로 변경되고 1번 노드에 XCUR 버퍼가 적재됩니다. (그림-2 참조)

그림-2. 1번 노드에서 동일 블록 내의 다른 레코드 UPDATE 및 COMMIT 수행후의 변경 내용

25-2

-- 2번 노드로부터 CR 버퍼와 CURRENT 버퍼를 각각 1개씩 전송 받습니다. 해당 블록의 마스터 노드는 3번이므로
-- 'gc cr block 3-way'와 'gc current block 3-way' 대기이벤트가 1회씩 발생합니다.

-- 그리고, 트랜잭션 수행을 위한 언두 헤더 블록과 언두 블록을 메모리로 적재하는 과정에서
-- 'db file sequential read' 대기이벤트가 2회 발생합니다.

-- 마지막으로 커밋 수행에 따른 'log file sync' 대기이벤트가 1회 발생합니다. 

SCOTT@OOW1:1> @set_trace_on 10046 8
SCOTT@OOW1:1> @one_row_update2 

WAIT #139902827416192: nam='gc cr block 3-way' ela= 2424 p1=6 p2=228 p3=1 obj#=93973 tim=337578449818
WAIT #139902827416192: nam='gc current block 3-way' ela= 2505 p1=6 p2=228 p3=33554433 obj#=93973 tim=337578453388
WAIT #139902827416192: nam='db file sequential read' ela= 1202 file#=4 block#=192 blocks=1 obj#=0 tim=337578455469
WAIT #139902827416192: nam='db file sequential read' ela= 1351 file#=4 block#=1474 blocks=1 obj#=0 tim=337578457287

WAIT #139902827440960: nam='log file sync' ela= 2514 buffer#=6901 sync scn=12156733 p3=0 obj#=0 tim=337578468566

-- 2번 노드의 LMS가 CR 버퍼와 CURRENT 버퍼를 각각 1개씩 전송한 것을 알 수 있습니다. 

SYS@OOW1:1> @init_temp_sesstat 91 65 43
SYS@OOW1:1> @get_temp_sesstat  91 65 43

INST_ID SERVER FLAG     NAME                           VALUE
------- ------ -------- ------------------------------ -----
      1 [FG]   [EVENT]  db file sequential read            2
                        gc cr block 3-way                  1
                        gc current block 3-way             1
               [STAT]   gc cr blocks received              1
                        gc current blocks received         1
                        physical reads                     2
                        session logical reads              5
      2 [LMS]  [STAT]   gc cr blocks served                1
                        gc current blocks served           1
                        session logical reads              1

-- 2번 노드의 버퍼 상태가 XCUR에서 PI로 변경되었습니다.
-- 1번 노드에 XCUR 및 CR 버퍼가 1개씩 적재되었습니다.
-- 1번 노드의 GRD에 GCS 클라이언트가 1개 생성되었고, 3번 노드의 GRD에 GCS SHADOW가 1개 생성되었습니다.

SYS@OOW1:1> @fnd_gcs_detail2 6 228

                        X$BH X$BH   X$BH                   X$BH
INST ADDR              CLASS STATE  LE_ADDR                 TCH BA
---- ---------------- ------ ------ ---------------- ---------- ----------------
OOW1 00007F8072042788      1 CR     00                        0 00000000751CC000
     00007F8072042908      1 XCUR   0000000073BE8BA8          1 0000000074910000

OOW2 00007F79DD4D06B0      1 CR     00                        0 0000000073540000
     00007F79DD4D0830      1 PI     00000000753FD2B0          2 0000000073A8E000

     X$KJBL           X$KJBL X$KJBL    X$KJBL     X$BH               X$BH X$BH
INST LOCKP             OWNER GRANT     LOCKST     LE_ADDR           CLASS STATE
---- ---------------- ------ --------- ---------- ---------------- ------ ------
OOW1 0000000073BE8C30      0 KJUSEREX  GRANTED    0000000073BE8BA8      1 XCUR
OOW2 00000000753FD338      1 KJUSERNL  GRANTED    00000000753FD2B0      1 PI
OOW3 00000000696D69C0      1 KJUSERNL  GRANTED
OOW3 0000000069728E78      0 KJUSEREX  GRANTED

4. 3번 노드에서 동일 블록 내의 다른 레코드 UPDATE 및 COMMIT 수행


3번 노드에서 동일 블록 내의 다른 레코드를 변경하면 1번 노드의 XCUR 버퍼는 PI 버퍼로 변경되고 3번 노드에 XCUR 버퍼가 적재됩니다. (그림-3 참조)

그림-3. 3번 노드에서 동일 블록 내의 다른 레코드 UPDATE 및 COMMIT 수행후의 변경 내용

25-3

-- 1번 노드로부터 CR 버퍼와 CURRENT 버퍼를 각각 1개씩 전송 받습니다. 해당 블록의 마스터 노드는 3번이므로
-- 'gc cr block 2-way'와 'gc current block 2-way' 대기이벤트가 1회씩 발생합니다.

-- 그리고, 트랜잭션 수행을 위한 언두 헤더 블록과 언두 블록을 메모리로 적재하는 과정에서
-- 'db file sequential read' 대기이벤트가 2회 발생합니다.

-- 마지막으로 커밋 수행에 따른 'log file sync' 대기이벤트가 1회 발생합니다. 

SCOTT@OOW1:1> @set_trace_on 10046 8
SCOTT@OOW1:1> @one_row_update3

WAIT #140357041043368: nam='gc cr block 2-way' ela= 2111 p1=6 p2=228 p3=1 obj#=93973 tim=311326241579
WAIT #140357041043368: nam='gc current block 2-way' ela= 2687 p1=6 p2=228 p3=33554433 obj#=93973 tim=311326245126
WAIT #140357041043368: nam='db file sequential read' ela= 2116 file#=2 block#=160 blocks=1 obj#=0 tim=311326247918
WAIT #140357041043368: nam='db file sequential read' ela= 4200 file#=2 block#=2335 blocks=1 obj#=0 tim=311326252599

WAIT #140357041184600: nam='log file sync' ela= 3590 buffer#=5594 sync scn=12156920 p3=0 obj#=0 tim=311326263131

-- 1번 노드의 LMS가 CR 버퍼와 CURRENT 버퍼를 각각 1개씩 전송한 것을 알 수 있습니다. 

SYS@OOW1:1> @init_temp_sesstat 91 65 43
SYS@OOW1:1> @get_temp_sesstat  91 65 43

INST_ID SERVER FLAG     NAME                           VALUE
------- ------ -------- ------------------------------ -----
      1 [LMS]  [STAT]   gc cr blocks served                1
                        gc current blocks served           1
                        session logical reads              1
      3 [FG]   [EVENT]  db file sequential read            2
                        gc cr block 2-way                  1
                        gc current block 2-way             1
               [STAT]   gc cr blocks received              1
                        gc current blocks received         1
                        physical reads                     2
                        session logical reads              5

-- 1번 노드의 버퍼 상태가 XCUR에서 PI로 변경되었습니다.
-- 3번 노드에 XCUR 및 CR 버퍼가 1개씩 적재되었습니다.
-- 3번 노드의 GRD에 GCS 클라이언트가 1개 생성되었습니다.

SYS@OOW1:1> @fnd_gcs_detail2 6 228

                        X$BH X$BH   X$BH                   X$BH
INST ADDR              CLASS STATE  LE_ADDR                 TCH BA
---- ---------------- ------ ------ ---------------- ---------- ----------------
OOW1 00007F80728C39A0      1 CR     00                        0 00000000751CC000
     00007F80728C3B20      1 PI     0000000073BE8BA8          1 0000000074910000

OOW2 00007F79DD4D06B0      1 CR     00                        0 0000000073540000
     00007F79DD4D0830      1 PI     00000000753FD2B0          2 0000000073A8E000

OOW3 00007FBB2D2152B8      1 CR     00                        0 0000000074962000
     00007FBB2D215438      1 XCUR   00000000757E6AD8          1 00000000745BE000

     X$KJBL           X$KJBL X$KJBL    X$KJBL     X$BH               X$BH X$BH
INST LOCKP             OWNER GRANT     LOCKST     LE_ADDR           CLASS STATE
---- ---------------- ------ --------- ---------- ---------------- ------ ------
OOW1 0000000073BE8C30      0 KJUSERNL  GRANTED    0000000073BE8BA8      1 PI
OOW2 00000000753FD338      1 KJUSERNL  GRANTED    00000000753FD2B0      1 PI
OOW3 0000000069728E78      0 KJUSERNL  GRANTED
OOW3 00000000696D69C0      1 KJUSERNL  GRANTED
OOW3 00000000757E6B60      2 KJUSEREX  GRANTED    00000000757E6AD8      1 XCUR

이전: [캐시 퓨전 #4] 변경된 블록 UPDATE 시에 발생하는 gc cr block busy, gc cr/current block 2-way, 3way 대기이벤트에 대한 이해

연재를 마무리하며

 


5개의 연재를 통해서 캐시 퓨전의 기본 원리에 대해서 살펴보았습니다. 다음 시간에는 경합에 의해 발생하는 buffer busy와 관련된 사항에 대해서 설명할 예정입니다.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s