Tibero DB 대기 이벤트
Tibero Database에서 발생하는 대기 이벤트 정보에 대하여 설명합니다.
V$SYSTEM_EVENT
Tibero는 서버 프로세스와 백그라운드 프로세스들이 일을 처리하는 과정에서 발생하는 대기 현상들을 측정하기 위 해 여러가지 대기 이벤트들을 정의하고 프로세스들이 일을 진행하다가 대기 이벤트가 발생할 때마다 횟수와 대기 시간을 내부에 저장합니다.
v$system_event는 인스턴스 기동 후 현재까지 누적된 이벤트 발생 현황을 시스템 레벨로 확인할 때 사용합니다.
개별 세션별로 누적치를 확인하려면 v$session_event를 조회하고 세션 레벨에서 현재 진행 중 이거나 바로 직전에 발생했던 이벤트 정보를 보여주는 View 는 v$session_wait 입니다.
Single DB
다음은 Single DB 쿼리 작성 예입니다.
SELECT name,
total_waits,
time_waited/1000000 "time_waited",
average_wait/1000000 "average_wait",
total_timeouts
FROM v$system_event
WHERE Total_waits>0
ORDER BY time_waited DESC;
결과는 아래와 같습니다.
NAME TOTAL_WAITS time_waited average_wait TOTAL_TIMEOUTS
---------- ------------ ----------- ------------ --------------
WE_CONN_IDLE 739 2.113803 .0028603560 0
WE_DBWR_IDLE 3458 .681122 .00019697 3450
WE_NTF_SNDR_IDLE 334 .342805 .001026362 334
WE_NMON_IDLE 334 .342702 .001026054 334
WE_TASK_MGR_IDLE 337 .342536 .001016427 334
WE_TPM_COLLECTOR_IDLE 334 .342449 .001025296 334
WE_LGWR_SLAVE 119 .34013 .002858235 0
WE_LGWR_IDLE 119 .339966 .002856857 112
WE_RSRC_IDLE 112 .33824 .00302 112
WE_ACTM_IDLE 33 .337832 .010237333 33
WE_TPM_SENDER_IDLE 11 .332167 .030197 11
WE_LARC_IDLE 12 .332117 .027676417 11
WE_CKPT_IDLE 309 .315669 .001021583 307
WE_WTHR_RECV 22 .207194 .009417909 0
WE_BG_READY 17 .016937 .000996294 0
WE_SPIN_SHP_ALLOC_SLAB 209 .007554 .000036144 0
WE_WTHR_READY 17 .004178 .000245765 0
WE_RECO_IDLE 2 .003147 .0015735 0
WE_JOB_SCHED_IDLE 3 .003115 .001038333 3
WE_RECO_REQ 1 .002164 .002164 0
WE_JC_BUF_DISK_READ 939 .00143 . 000001523 0
WE_BUF_WAIT 16 .00017 .000010625 0
WE_JC_LGWR_AIO_SUBMIT_REQUEST 8 .000153 .000019125 0
WE_SPIN_SHP_ALLOC_MISC 306 .000117 .000000382 0
WE_LOG_FLUSH_COMMIT 6 .000048 .000008 0
WE_JC_BUF_DISK_READM 6 .000007 .000001167 0
WE_RECO_REPLY 2 .000003 .0000015 0
WE_LOG_FLUSH_REQ 1 0 0 0
WE_SPIN_BUF_BUCKET 238 0 0 0
WE_SPIN_SHP_ALLOC_LC 1 0 0 0
WE_SPIN_SHP_ALLOC_DD 2 0 0 0
WE_SPIN_ALLOC_LRU 1 0 0 0
TAC DB
다음은 TAC DB 쿼리 작성 예입니다.
SELECT inst_id,
name, total_waits,
time_waited/1000000 "time_waited",
average_wait/1000000 "average_wait",
total_timeouts
FROM gv$system_event
WHERE Total_waits>0
ORDER BY inst_id, time_waited DESC ;
결과는 아래와 같습니다.
INST_ID NAME TOTAL_WAITS time_waited average_wait TOTAL_TIMEOUTS
------- ------------------- ------------- -------------- ------------ ---------------
1 WE_ACF_CMPT 1902 5.854036 .003077832 0
1 WE_CONN_IDLE 522 1.556958 .002982678 0
1 WE_ACF_ATH 720 .499886 .000694286 0
1 WE_ACF_GC 462 .473068 .001023957 462
1 WE_DBWR_IDLE 2497 .46998 .000188218 2477
1 WE_NMON_IDLE 232 .23756 .001023966 232
1 WE_NTF_SNDR_IDLE 232 .237513 .001023763 232
1 WE_TPM_COLLECTOR_IDLE 232 .237505 .001023728 232
1 WE_TASK_MGR_IDLE 234 .236753 .001011765 231
1 WE_ACF_RECONF 49 .235883 .004813939 46
1 WE_ACTM_IDLE 23 .235396 .010234609 23
1 WE_LGWR_IDLE 94 .235207 .002502202 77
1 WE_LGWR_SLAVE 95 .235205 .002475842 0
1 WE_RSRC_IDLE 78 .23469 .003008846 78
1 WE_CKPT_IDLE 231 .234052 .001013212 229
1 WE_TPM_SENDER_IDLE 7 .211622 .030231714 7
1 WE_LARC_IDLE 8 .211508 .0264385 7
1 WE_WTHR_RECV 9 .105829 .011758778 0
1 WE_BG_READY 17 .017796 .001046824 0
1 WE_JOB_SCHED_IDLE 4 .003438 .0008595 3
1 WE_ACF_CRAS 3 .003133 .001044333 0
1 WE_ACF_RCF 16 .002916 .00018225 0
1 WE_RECO_IDLE 2 .002708 .001354 0
1 WE_RECO_REQ 1 .002458 .002458 0
1 WE_ACF_MTX_RW 1 .00087 .00087 0
1 WE_CWS_AST 386 .000414 .000001073 0
1 WE_WTHR_READY 9 .000302 .000033556 0
1 WE_CCC_AST_CR 330 .000188 .00000057 0
1 WE_JC_BUF_DISK_READ 306 .000156 .00000051 0
1 WE_CCC_AST_CUR 123 .000054 .000000439 0
1 WE_SPIN_SHP_ALLOC_SLAB 122 .000047 .000000385 0
1 WE_CCC_AST_MBR 13 .000014 .000001077 0
1 WE_SPIN_SHP_ALLOC_MISC 297 .000011 .000000037 0
1 WE_ACF_GMC 13 .000011 .000000846 0
1 WE_GV_REPLY 8 .00001 .00000125 0
1 WE_LOG_FLUSH_COMMIT 13 .000009 .000000692 0
1 WE_CR_BUF_BUSY_LOCAL 10 .000007 .0000007 0
1 WE_JC_BUF_DISK_READM 4 .000005 .00000125 0
1 WE_BUF_WAIT 8 .000005 .000000625 0
1 WE_RECO_REPLY 4 .000005 .00000125 0
1 WE_GV_REQ 3 .000005 .000001667 0
1 WE_LOG_FLUSH_REQ 1 .000003 .000003 0
1 WE_JC_LGWR_AIO_SUBMIT_REQUEST 18 0 0 0
1 WE_SPIN_BUF_BUCKET 675 0 0 0
각 항목에 대한 설명은 다음과 같습니다.
항목
설명
INST_ID
Tibero 인스턴스 정보 (TAC DB 질의 쿼리)
TOTAL_WAITS
해당 이벤트가 호출된 총 횟수
time_waited
해당 이벤트에서 대기한 시간 (단위 : 초)
Average_wait
해당 이벤트에서 한번에 대기한 평균 시간 (단위 : 초)
Total_Timeout
해당 이벤트에 Timeout이 설정이 되어 있을 때 Timeout 발생 횟수
주요 이벤트는 아래와 같습니다.
이벤트
설명
WE_SEQ_WRITEBACK
Agent가 Seq를 Writeback할 때까지 기다리는 이벤트
WE_SEQ_FREESLOT
Seq_Buffer_의 Free Slot이 없을 때까지 기다리는 이벤트
WE_SEQ_NEXTVAL
Agent가 New Value를 Cache에 올릴 때까지 기다리는 이벤트
WE_BUF_WAIT
Buf Pin을 위해 기다리는 이벤트
WE_BUF_WRITE
Buf Write까지 기다리는 이벤트
WE_BUF_FREE
Free Buf가 생길 때까지 기다리는 이벤트
WE_MBR_WAIT
MBR이 끝날 때까지 기다리는 이벤트
WE_SEQ_FLUSH
Seq alba가 Cache Flush를 마칠 때까지 기다리는 이벤트
WE_WTHR_READY
WTHR Ready까지 기다리는 이벤트
WE_LGWR_ARCHIVE
LGWR Process가 Archive 완료할 때까지 기다리는 이벤트
WE_LGWR_LNW
LGWR Process가 네트워크를 통해 로그를 쓸 때까지 기다리는 이벤트
WE_LOG_FLUSH
Log Flush 할 때까지 기다리는 이벤트
WE_LOG_FLUSH_SPACE
공간이 부족해서 Log Flush할 때까지 기다리는 이벤트
WE_LOG_FLUSH_REQ
Log Flush를 요청해서 기다리는 이벤트
WE_CKPT_WAIT
Checkpoint를 기다리는 이벤트
WE_PROC_DOWN
Shutdown Finish되는 경우 발생하는 이벤트
WE_WTHR_START
WTHR가 시작되기 위해서 메시지를 받을 때까지 기다리는 이벤트
WE_WTHR_MSG
WTHR가 클라이언트의 MSG를 기다리는 이벤트
WE_ACF_SCVR
SCVR(scavenger)에서 CCC/CWS RSB(Resource Block)를 reclaim 요청 받을 때 까지 기다리는 이벤트
만약 reclaim 요청이 없더라도 주기적 (_ACF_SCVR_TIMEOUT(기본값 : 1초))으로 깨어나서 reclaim을 수행
WE_ACF_AST
WTHR가 AST(asynchronous system trap)인 경우 이벤트
Waiting은 실제 수행되는 작업의 성능을 저하하므로 가장 많이 발생하는 대기 이벤트를 중점적으로 해결하고 각 대 기 이벤트의 종류에 따라 Waiting이 많이 발생하는 이벤트를 해결합니다. 또한 모든 wlock 관련 정보는 대기 이벤트로 나타나므로 wlock Contention을 알아보는데 사용할 수 있습니다.
예제
다음은 여러 세션이 특정 Block에 지속적으로 업데이트를 하면서 동시에 계속 Commit을 수행하고 있을 때WE_LOG_FLUSH_COMMIT 이벤트가 많이 발생하는 예입니다.
V$session_wait 쿼리를 조회해 보면 다음과 같습니다.
[그림 1] V$session_wait 수행 결과

V$system_event 수행결과를 통해 해당 이벤트가 255471번 호출된 것을 아래와 같이 확인할 수 있습니다.
[그림2] V$system_event 수행 결과

Commit 횟수를 줄이면 WE_LOG_FLUSH_COMMIT 이벤트가 호출된 횟수 또는 Waiting한 시간이 크게 개선된 것을 확인할 수 있습니다.
[그림3] WE_LOG_FLUSH_COMMIT 개선 효과

WE_LOG_FLUSH_COMMIT 이벤트가 줄어든 만큼 Hot Block의 경합으로 인해 WE_BUF_WAIT 이벤트가 발생하는 것을 확인할 수 있습니다. WE_BUF_WAIT는 Buffer Pinning을 위해 대기하는 이벤트로 동일 Block에 대해 업데이트를 하기 때문에 발생하는 이벤트입니다.
V$SYSSTAT
인스턴스 기동 후 현재까지 누적된 수행 통계치를 시스템 레벨로 확인할 때 사용하는 View가 v$sysstat 이고 개별 세션별로 확인할 때 사용하는 View가 v$sesstat 입니다. 또한 현재 접속해 있는 본인 세션에 대한 수행 통계는 v$mystat을 통해 확인이 가능합니다.
Single DB
다음은 Single DB 쿼리 작성 예입니다.
SELECT *
FROM v$sysstat
order by value desc;
결과값은 아래와 같습니다.
STAT# NAME CLASS VALUE
----- ------------------------------------ ---------- ------------
1687 req service time 7 2299456122
1692 SQL processing time 4 2296995825
8827 Inner SQL processing time 4 2205272006
6757 SQL execute elapsed time 4 2194635979
9687 cursor fetch time in SQL process 7 2190428869
2567 csr fetch select time 4 1914352565
1632 transactions total time 7 397179327
1712 csr fetch update time 4 278915574
6392 DML update time 4 272191133
6427 update pick current block time 4 268970800
8152 After inner SQL processing time 4 89187498
3947 reply message plus log flush waiting time 4 85357794
3762 reply msg processing time for sql 4 84360096
617 redo wait time for flush time 1 83489590
3752 log flush waiting time 4 80705939
622 redo write time 2 75552684
10872 submit lgwr aio request time 16 69949301
4492 DB CPU time 7 59192955
596 redo log size 1 27065213
1681 sent message size (byte) 4 22649208
7552 dbwr aio slave bitq read time 7 10726440
9607 preparing cursor fetch time in SQL process 7 8348468
6742 parse time elapsed 4 6370379
1682 sent message time 4 5483956
9682 executor tree generation time in SQL process 7 5372611
3942 table full scan time 4 4633794
3757 write reply message time(syscall) 4 4190447
4412 profile check time 7 3488971
9797 cursor close all time 4 3160322
3792 cursor close time 4 2871394
146 candidate bh scanned buffers 7 2856728
6747 hard parse elapsed time 4 2702998
292 dbwr write time - OS 2 2106676
297 dbwr write time 7 2051949
9847 dbwr write suspend time 7 1946449
4422 Total times to update session login/logout time 7 1759645
6402 table single update time 4 1699029
6522 ppc search time 4 1658335
8147 Before inner SQL processing time 4 1574051
145 candidate bh scanned 7 1565170
2037 optimizer time 4 1564116
8021 logical reads 17 1547617
TAC DB
다음은 TAC DB 쿼리 작성 예입니다.
SELECT *
FROM gv$sysstat
order by inst_id, value desc;
결과값은 아래와 같습니다.
INST_ID STAT# NAME CLASS VALUE
------- ------ ------------------------------------------ ------- ----------
1 2527 Total Times sleeps to wait acf task ready 5 21164597
1 7116 INC messages received size 5 4622210
1 7121 INC packets received size 5 4622210
1 6742 parse time elapsed 4 1483226
1 6747 hard parse elapsed time 4 1477528
1 7141 INC packets sent size 5 963718
1 7136 INC messages sent size 5 799709
1 2037 optimizer time 4 797031
1 2472 Total Times sleeps to wait ctx sync 5 713767
1 32 block disk read time 17 605534
1 6847 optimizer loading statistics time 4 595535
1 4842 dd search time 4 574467
1 4847 dd search - load time 4 560479
1 3292 optimizer dynamic sampling time 4 502320
1 8002 current block received RTT 5 486245
1 1632 transactions total time 7 473131
1 3297 optimizer dynamic sampling block read time 4 442447
1 622 redo write time 2 354457
1 2547 Total Round Trip Times to grant lock 5 342502
1 297 dbwr write time 7 324160
1 292 dbwr write time - OS 2 322394
1 9847 dbwr write suspend time 7 319952
1 7552 dbwr aio slave bitq read time 7 312180
1 5827 current block received RTT:data block 5 301297
1 4532 isgmt get cr time 3 255159
1 7742 INC messages passed to CMPT - time 5 252813
1 6892 INC messages sent without block time 5 243157
1 4527 dsgmt get cr time 4 242525
1 4537 isgmt get cr in lvl time 3 240762
1 4217 Total CR blocked time by CUR request 5 234883
1 4507 tdi fetch start time 3 221763
1 4897 Total Round Trip Times to grant wait-lock 5 200031
1 6757 SQL execute elapsed time 4 197059
1 4412 profile check time 7 171434
1 4427 total times to begin tx 7 161552
1 2567 csr fetch select time 4 150829
1 4442 total times to get undo block and apply 7 150210
1 4447 total times to get undo block 7 148789
1 7782 Total Times sleeps to wait WRCF status 5 122150
1 5837 current block received RTT:index leaf block 5 90114
1 7772 Total Times sleeps to wait CRCF status 5 83969
1 617 redo wait time for flush time 1 79085
1 7137 INC messages sent time 5 79046
1 7752 INC messages sent from send queue - time 5 75017
1 8857 INC messages received by batch - time 5 57922
1 9632 PSM SQL processing time for cursor open 7 52662
1 9662 PSM SQL processing time 7 52642
1 1687 req service time 7 51710
1 1692 SQL processing time 4 51695
1 8827 Inner SQL processing time 4 51336
1 9767 stat load query soft parse time elapsed 4 50949
1 9752 stat load query hard parse elapsed time 4 49593
1 7767 Total Times to process CCC message 5 41603
1 596 redo log size 1 39491
1 5822 current block received RTT:segment header 5 36180
1 6762 PSM execution elapsed time 0 35483
1 11097 index scan time 4 35305
각 항목에 대한 설명은 다음과 같습니다.
항목
설명
INST_ID
Tibero 인스턴스 정보 (TAC DB 질의 쿼리)
STAT#
Stat 번호.
NAME
Stat 이름.
VALUE
Stat 값
v$sysstat와 v$sesstat에 나타나는 값들은 인스턴스 기동 후 또는 세션 수립 후 현재까지 누적된 값이므로 그 값의 크고 작음으로 의미있는 정보를 얻기 어렵습니다.
이를 제대로 활용하는 방법은 두 구간 사이의 변화량을 구해 SQL 수행 도중에 내부적으로 어떤 일들이 발생했는지 판명하는 것입니다.
Spin Lock Contention
TSM(Tibero Shared Memory)의 모든 Spin Lock에 대한 적중률을 확인합니다.
Single DB
다음은 Single DB 쿼리 작성 예입니다.
SELECT name "Name",
SUM(fast_cnt + try_get_cnt) as "Gets",
SUM(spin_cnt + sleep_cnt + try_fail_cnt) as "Misses",
SUM(sleep_cnt) as "Sleeps",
round((1 - (SUM(spin_cnt + sleep_cnt + try_fail_cnt) /
SUM(fast_cnt + spin_cnt + sleep_cnt + try_get_cnt + try_fail_cnt))) * 100, 3)
as "Hit Ratio"
FROM _vt_spinlock
GROUP BY type,
pin_level,
name
HAVING SUM(fast_cnt + try_get_cnt) > 0
ORDER BY 4 DESC,
2 DESC;
결과는 아래와 같습니다.
Name Gets Misses Sleeps Hit Ratio
--------------------------- --------- ---------- -------- ---------
SPIN_SHP_ALLOC_SLAB 3927 49 2 98.768
SPIN_BUF_BUCKET 206134 58 1 99.972
SPIN_LC_BUCKET 51315 1 1 99.998
SPIN_SHP_ALLOC_MISC 9636 60 1 99.381
SPIN_ROOT_ALLOC 7419 9 1 99.879
SPIN_BUF_WS 189376 0 0 100
SPIN_BUF_WS_CKPT 174230 0 0 100
SPIN_ALLOC 45179 15 0 99.967
SPIN_SQLSTATS 24092 1 0 99.996
SPIN_RECR_UNPIN 16527 0 0 100
SPIN_BITQ 16014 0 0 100
SPIN_L1CL 11200 0 0 100
SPIN_PARAM 5012 16 0 99.682
SPIN_DD_CACHE_BUCKET 4594 14 0 99.696
SPIN_WLOCK 4194 28 0 99.337
SPIN_SESS_CSR_POOL 3065 0 0 100
SPIN_ENABLED_ROLES 2061 0 0 100
SPIN_DBWR_AIOQ 1449 0 0 100
SPIN_SLAB_ALLOC 1371 0 0 100
SPIN_ALLOC_LRU 1064 0 0 100
SPIN_PP_QSTAT 791 1 0 99.874
SPIN_FD_BUCKET 704 0 0 100
SPIN_GLOBAL_MEM_MGR 551 0 0 100
SPIN_SC_ALLOC 547 0 0 100
SPIN_FIXED_SYS_MEM_INFO 527 0 0 100
SPIN_SHP_ALLOC_DD 405 0 0 100
SPIN_SESS_TSAM_HNDL_POOL 405 0 0 100
SPIN_SESS_LTIME 384 0 0 100
SPIN_CF 368 0 0 100
SPIN_REDO_ALLOC 337 0 0 100
SPIN_IMCS_PARAM 336 0 0 100
SPIN_GV_PARAM 336 0 0 100
SPIN_REDO_COPY 264 0 0 100
SPIN_WTHR_READY 240 0 0 100
SPIN_CKPT_PROGRESS 166 0 0 100
SPIN_SHP_ALLOC_LC 142 0 0 100
SPIN_CL_CONN 122 0 0 100
SPIN_USGMT_HASH 122 0 0 100
SPIN_PROC_MEM_MGR 116 0 0 100
SPIN_TSGMT_LIST 116 0 0 100
SPIN_SESS_SERIAL_NO 114 7 0 94.215
RW_SYSCTX 112 0 0 100
SPIN_ALERT 112 0 0 100
SPIN_PE_SESS 112 0 0 100
SPIN_MAIO_POOL 112 0 0 100
SPIN_TEMP_TS_ID 110 0 0 100
SPIN_LISTENER 107 0 0 100
SPIN_SERVER 107 0 0 100
SPIN_IMCS_REQ_LIST 96 0 0 100
SPIN_TSN_TIME_MAP 95 1 0 98.958
SPIN_DBWR_IOSLOT 80 0 0 100
SPIN_FDPOOL 53 0 0 100
SPIN_ASH_CSR_READ 53 0 0 100
SPIN_DBWR_LOW 52 0 0 100
SPIN_DBWR_IR_STATUS 50 0 0 100
SPIN_PP_EXPCN_LIST 48 0 0 100
SPIN_PPID 48 0 0 100
SPIN_XA_VTI 39 0 0 100
SPIN_SVRMODE_ACK 36 0 0 100
SPIN_BUF_GLOBAL_RECOQ 29 0 0 100
SPIN_REDO_WRITING 26 0 0 100
SPIN_USGMT_CACHE 25 0 0 100
SPIN_XQC 20 0 0 100
SPIN_LGWR_AIO_REQ 16 0 0 100
SPIN_DML_STAT_BUCKET 15 0 0 100
SPIN_TXR 14 0 0 100
SPIN_BUDDY_ALLOC 13 0 0 100
SPIN_ALLOC_POOL 12 0 0 100
SPIN_MSG_LIST 10 0 0 100
SPIN_SHP_ALLOC_SUPER 9 0 0 100
SPIN_TX 9 0 0 100
SPIN_SHUTDOWN 8 0 0 100
SPIN_PEP 6 0 0 100
SPIN_TEMP_UNIT_POOL 4 0 0 100
SPIN_BUF_FREE_WAIT 2 0 0 100
SPIN_LOGNET_WRITE 1 0 0 100
TAC DB
다음은 TAC DB 쿼리 작성 예입니다.
SELECT INST_ID,
name "Name",
SUM(fast_cnt + try_get_cnt) as "Gets",
SUM(spin_cnt + sleep_cnt + try_fail_cnt) as "Misses",
SUM(sleep_cnt) as "Sleeps",
round((1 - (SUM(spin_cnt + sleep_cnt + try_fail_cnt)
/ SUM(fast_cnt + spin_cnt + sleep_cnt + try_get_cnt + try_fail_cnt)))
* 100, 3) as "Hit Ratio"
FROM _gvt_spinlock
GROUP BY INST_ID,
type,
spin_level,
name
HAVING SUM(fast_cnt + try_get_cnt) > 0
ORDER BY 2,
5 DESC,
3 DESC;
결과는 아래와 같습니다.
INST_ID Name Gets Misses Sleeps Hit Ratio
------- -------------------------- -------- ------- ------ ------------
1 SPIN_SHP_ALLOC_SLAB 3927 49 2 98.768
1 SPIN_BUF_BUCKET 206134 58 1 99.972
1 SPIN_LC_BUCKET 51315 1 1 99.998
1 SPIN_SHP_ALLOC_MISC 9636 60 1 99.381
1 SPIN_ROOT_ALLOC 7419 9 1 99.879
1 SPIN_BUF_WS 189376 0 0 100
1 SPIN_BUF_WS_CKPT 174230 0 0 100
1 SPIN_ALLOC 45179 15 0 99.967
1 SPIN_SQLSTATS 24092 1 0 99.996
1 SPIN_RECR_UNPIN 16527 0 0 100
1 SPIN_BITQ 16014 0 0 100
1 SPIN_L1CL 11200 0 0 100
1 SPIN_PARAM 5012 16 0 99.682
1 SPIN_DD_CACHE_BUCKET 4594 14 0 99.696
1 SPIN_WLOCK 4194 28 0 99.337
1 SPIN_SESS_CSR_POOL 3065 0 0 100
1 SPIN_ENABLED_ROLES 2061 0 0 100
1 SPIN_DBWR_AIOQ 1449 0 0 100
1 SPIN_SLAB_ALLOC 1371 0 0 100
1 SPIN_ALLOC_LRU 1064 0 0 100
1 SPIN_PP_QSTAT 791 1 0 99.874
1 SPIN_FD_BUCKET 704 0 0 100
1 SPIN_GLOBAL_MEM_MGR 551 0 0 100
1 SPIN_SC_ALLOC 547 0 0 100
1 SPIN_FIXED_SYS_MEM_INFO 527 0 0 100
1 SPIN_SHP_ALLOC_DD 405 0 0 100
1 SPIN_SESS_TSAM_HNDL_POOL 405 0 0 100
1 SPIN_SESS_LTIME 384 0 0 100
1 SPIN_CF 368 0 0 100
1 SPIN_REDO_ALLOC 337 0 0 100
1 SPIN_IMCS_PARAM 336 0 0 100
1 SPIN_GV_PARAM 336 0 0 100
1 SPIN_REDO_COPY 264 0 0 100
1 SPIN_WTHR_READY 240 0 0 100
1 SPIN_CKPT_PROGRESS 166 0 0 100
1 SPIN_SHP_ALLOC_LC 142 0 0 100
1 SPIN_CL_CONN 122 0 0 100
1 SPIN_USGMT_HASH 122 0 0 100
1 SPIN_PROC_MEM_MGR 116 0 0 100
1 SPIN_TSGMT_LIST 116 0 0 100
1 SPIN_SESS_SERIAL_NO 114 7 0 94.215
1 RW_SYSCTX 112 0 0 100
1 SPIN_ALERT 112 0 0 100
1 SPIN_PE_SESS 112 0 0 100
1 SPIN_MAIO_POOL 112 0 0 100
1 SPIN_TEMP_TS_ID 110 0 0 100
1 SPIN_LISTENER 107 0 0 100
1 SPIN_SERVER 107 0 0 100
1 SPIN_IMCS_REQ_LIST 96 0 0 100
1 SPIN_TSN_TIME_MAP 95 1 0 98.958
1 SPIN_DBWR_IOSLOT 80 0 0 100
1 SPIN_FDPOOL 53 0 0 100
1 SPIN_ASH_CSR_READ 53 0 0 100
1 SPIN_DBWR_LOW 52 0 0 100
1 SPIN_DBWR_IR_STATUS 50 0 0 100
1 SPIN_PP_EXPCN_LIST 48 0 0 100
1 SPIN_PPID 48 0 0 100
1 SPIN_XA_VTI 39 0 0 100
1 SPIN_SVRMODE_ACK 36 0 0 100
1 SPIN_BUF_GLOBAL_RECOQ 29 0 0 100
1 SPIN_REDO_WRITING 26 0 0 100
1 SPIN_USGMT_CACHE 25 0 0 100
1 SPIN_XQC 20 0 0 100
1 SPIN_LGWR_AIO_REQ 16 0 0 100
1 SPIN_DML_STAT_BUCKET 15 0 0 100
1 SPIN_TXR 14 0 0 100
1 SPIN_BUDDY_ALLOC 13 0 0 100
1 SPIN_ALLOC_POOL 12 0 0 100
1 SPIN_MSG_LIST 10 0 0 100
1 SPIN_SHP_ALLOC_SUPER 9 0 0 100
1 SPIN_TX 9 0 0 100
1 SPIN_SHUTDOWN 8 0 0 100
1 SPIN_PEP 6 0 0 100
1 SPIN_TEMP_UNIT_POOL 4 0 0 100
1 SPIN_BUF_FREE_WAIT 2 0 0 100
1 SPIN_LOGNET_WRITE 1 0 0 100
각 항목에 대한 설명은 다음과 같습니다.
항목
설명
INST_ID
Tibero 인스턴스 정보 (TAC DB 질의 쿼리)
NAME
Spin Lock의 종류
Gets
최초 시도에서 Spin Lock 획득을 요청한 경우 값을 Gets값을 1씩 증가
Misses
최초 시도에서 Spin Lock 획득에 실패한 경우 Misses값을 1씩 증가
Sleeps
슬립 상태에 빠질때마다 1씩 증가
Hit Ratio
적중률
Willing-to-Wait 모드에서의 Latch 획득 성공과 실패에 대한 통계값은 v$latch View를 통해 조회합니다. Gets(I), Misses(I) 항목은 각각 Gets(또는 Immediate gets)와 Misses(또는 Immediate misses)값을 의미하며 Gets와 Immediate gets 가운데 큰 값을 보여줍니다.
Gets가 Willing-to-Wait 모드로 요청된 경우 Immediate gets는 No-Wait 모드로 요청됩니다. Willing-to-Wait 모드는 Spin Lock 획득에 실패하는 경우 Spin과 Sleep을 하면서 획득에 성공할 때까지 재시도를 하고, No-Wait 모드는 원하는 Spin Lock 획득에 실패하는 경우 해당 Latch를 위해 Wait하지 않으므로 기본적으로 Willing-to-Wait 모드를 사용한다는 것은 Spin Lock을 획득할 때까지 대기한다는 의미입니다.
Spin Lock 모니터링
Spin Lock의 Contention에 대한 정보를 확인합니다.
Single DB
다음은 Single DB 쿼리 작성 예입니다.
SELECT name,
gets,
misses,
spin_gets,
sleeps,
decode(gets,0,0,trunc((1-misses/(misses+gets))*100,2)) "Hit Ratio",
wait_time,
round(ratio_to_report(wait_time)over()*100,2) "WAIT_TIME(%)"
FROM v$latch
ORDER BY 7 desc,
3 desc ;
결과는 아래와 같습니다.
NAME GETS MISSES SPIN_GETS SLEEPS Hit Ratio WAIT_TIME WAIT_TIME(%)
------------------- ----------- --------- ------------ ---------- ------------- --------- -------------
SPIN_ALLOC 2310004 877 863 14 99.96 12072 20.63
SPIN_BITQ 1112055 19 19 0 99.99 10357 17.7
SPIN_SHP_ALLOC_SLAB 4022 35 28 7 99.13 7335 12.53
SPIN_LC_BUCKET 3840144 0 0 0 100 7036 12.02
SPIN_TSN_TIME_MAP 7172 58 6 52 99.19 5443 9.3
SPIN_SHP_ALLOC_MISC 127549 3018 2996 22 97.68 5138 8.78
SPIN_PARAM 64866 655 645 10 99 2475 4.23
SPIN_DD_CACHE_BUCKET 30799 461 453 8 98.52 1591 2.72
SPIN_L1CL 812300 412 407 5 99.94 1110 1.9
SPIN_SESS_CSR_POOL 162123 3 2 1 99.99 1089 1.86
SPIN_BUF_BUCKET 483194 340 340 0 99.92 816 1.39
SPIN_CF 7845 0 0 0 100 784 1.34
SPIN_WLOCK 153143 780 777 3 99.49 759 1.3
SPIN_BUF_WS_CKPT 347369 0 0 0 100 628 1.07
SPIN_DBWR_AIOQ 107097 0 0 0 100 524 .9
SPIN_BUF_WS 344857 0 0 0 100 518 .89
SPIN_CKPT_PROGRESS 11743 3 3 0 99.97 344 .59
SPIN_REDO_ALLOC 4536 2 0 2 99.95 121 .21
RW_SYSCTX 8123 0 0 0 100 79 .13
SPIN_REDO_WRITING 1336 0 0 0 100 40 .07
SPIN_CL_CONN 8272 0 0 0 100 40 .07
SPIN_USGMT_CACHE 287 1 0 1 99.65 31 .05
SPIN_ENABLED_ROLES 65255 0 0 0 100 29 .05
SPIN_DBWR_LOW 3665 0 0 0 100 27 .05
SPIN_DBWR_IR_STATUS 3651 0 0 0 100 23 .04
SPIN_SLAB_ALLOC 3294 1 1 0 99.96 14 .02
SPIN_SQLSTATS 94656 0 0 0 100 14 .02
SPIN_GV_PARAM 24431 0 0 0 100 13 .02
SPIN_PP_QSTAT 24753 0 0 0 100 12 .02
SPIN_IMCS_REQ_LIST 7168 0 0 0 100 12 .02
SPIN_SERVER 8118 0 0 0 100 11 .02
SPIN_SESS_LTIME 28672 0 0 0 100 10 .02
SPIN_MAIO_POOL 8123 0 0 0 100 7 .01
SPIN_ALERT 8123 1 1 0 99.98 5 .01
SPIN_LISTENER 8117 0 0 0 100 5 .01
SPIN_ROOT_ALLOC 9140 0 0 0 100 2 0
SPIN_PPID 141 0 0 0 100 2 0
SPIN_SVRMODE_ACK 36 2 2 0 94.73 1 0
SPIN_FIXED_SYS_MEM_INFO 527 0 0 0 100 1 0
SPIN_PROC_MEM_MGR 414 0 0 0 100 1 0
SPIN_BUF_FREE_WAIT 15 0 0 0 100 1 0
SPIN_TXR 753 0 0 0 100 1 0
SPIN_SHP_ALLOC_LC 452 0 0 0 100 1 0
SPIN_BUF_GLOBAL_RECOQ 2154 0 0 0 100 1 0
SPIN_MSG_LIST 102 0 0 0 100 1 0
SPIN_USGMT_HASH 411 0 0 0 100 1 0
SPIN_SESS_SERIAL_NO 8132 239 239 0 97.14 0 0
SPIN_ALLOC_LRU 21470 1 1 0 99.99 0 0
SPIN_TEST1B 0 0 0 0 0 0 0
SPIN_TEST1A 0 0 0 0 0 0 0
SPIN_TEST1 0 0 0 0 0 0 0
SPIN_REDO_COPY 0 0 0 0 0 0 0
TAC DB
다음은 TAC DB 쿼리 작성 예입니다.
SELECT inst_id,
name,
gets,
misses,
spin_gets,
sleeps,
decode(gets,0,0,trunc((1-misses/(misses+gets))*100,2)) "Hit Ratio",
wait_time,
round(ratio_to_report(wait_time)over()*100,2) "WT(%)"
FROM gv$latch
ORDER BY 1 asc,
8 desc,
4 desc;
결과는 아래와 같습니다.
INST_ID NAME GETS MISSES SPIN_GETS SLEEPS Hit Ratio WAIT_TIME WT(%)
------- --------------------- ------ ------ --------- --------- ---------- ----------- --------
1 SPIN_CWS_RSB 6091 130 80 50 97.91 110322 65.15
1 SPIN_ALLOC 135601 264 261 3 99.8 12052 7.12
1 SPIN_ROOT_ALLOC 4365 5 0 5 99.88 12026 7.1
1 SPIN_SHP_ALLOC_SLAB 3888 25 23 2 99.36 2319 1.37
1 SPIN_BUF_WS 80234 12 10 2 99.98 786 .46
1 SPIN_BITQ 72616 3 3 0 99.99 532 .31
1 SPIN_SHP_ALLOC_MISC 10902 477 476 1 95.8 439 .26
1 SPIN_BUF_BUCKET 142547 501 501 0 99.64 280 .17
1 SPIN_WLOCK 14999 141 140 1 99.06 140 .08
1 SPIN_LC_BUCKET 212034 1 1 0 99.99 120 .07
1 SPIN_DD_CACHE_BUCKET 7999 109 109 0 98.65 111 .07
1 SPIN_CWS_RSBTBL 4221 112 112 0 97.41 91 .05
1 SPIN_CCC_RSB 5415 11 9 2 99.79 83 .05
1 SPIN_PARAM 8316 243 243 0 97.16 80 .05
1 SPIN_CCC_RSBTBL 113351 11 11 0 99.99 47 .03
1 SPIN_DBWR_AIOQ 5998 0 0 0 100 21 .01
1 SPIN_GMC_HANDLE 228 0 0 0 100 16 .01
1 SPIN_SQLSTATS 13903 0 0 0 100 5 0
1 SPIN_L1CL 47948 0 0 0 100 5 0
1 SPIN_CCC_RECL_WS 3147 6 6 0 99.8 4 0
1 SPIN_SHP_ALLOC_DD 712 3 3 0 99.58 3 0
1 SPIN_GV_PARAM 1428 1 1 0 99.93 2 0
1 SPIN_TSN_TIME_MAP 386 0 0 0 100 2 0
1 SPIN_ACF_MTX_RW 2220 0 0 0 100 2 0
1 SPIN_ACF_RCF 246 0 0 0 100 2 0
1 SPIN_RECR_UNPIN 5795 0 0 0 100 2 0
1 SPIN_CWS_RECL_WS 842 2 2 0 99.76 1 0
1 SPIN_SVRMODE_ACK 39 1 1 0 97.5 1 0
1 SPIN_CF 1080 0 0 0 100 1 0
1 SPIN_CKPT_PROGRESS 699 0 0 0 100 1 0
1 SPIN_ACF_NMGR 188 0 0 0 100 1 0
1 SPIN_SESS_SERIAL_NO 468 89 89 0 84.02 0 0
1 SPIN_CWS_LCB 16880 40 40 0 99.76 0 0
1 SPIN_MAIO 0 0 0 0 0 0 0
1 SPIN_CCC_LKBTBL 2675 0 0 0 100 0 0
1 SPIN_ACF_TIMEOUT 3408 0 0 0 100 0 0
1 SPIN_CWS_LKBTBL 1321 0 0 0 100 0 0
1 SPIN_TXR 55 0 0 0 100 0 0
1 SPIN_TEST3 0 0 0 0 0 0 0
1 SPIN_USGMT_CACHE 107 0 0 0 100 0 0
1 SPIN_PPID 66 0 0 0 100 0 0
1 SPIN_BUF_GLOBAL_RECOQ 116 0 0 0 100 0 0
1 SPIN_CCC_CRAS 0 0 0 0 0 0 0
1 SPIN_REDO_COPY 0 0 0 0 0 0 0
1 SPIN_MAIO_POOL 459 0 0 0 100 0 0
1 SPIN_USGMT_HASH 309 0 0 0 100 0 0
1 SPIN_PP_EXPCN_LIST 66 0 0 0 100 0 0
1 SPIN_PPSTAT 0 0 0 0 0 0 0
1 SPIN_RCMAP_BUCKET 0 0 0 0 0 0 0
1 SPIN_RCACHE 0 0 0 0 0 0 0
1 SPIN_TAS_DS 0 0 0 0 0 0 0
1 SPIN_SM_BUCKET 0 0 0 0 0 0 0
1 SPIN_TEST1 0 0 0 0 0 0 0
1 SPIN_TEST1A 0 0 0 0 0 0 0
1 SPIN_TEST1B 0 0 0 0 0 0 0
1 SPIN_BUF_FREE_WAIT 10 0 0 0 100 0 0
1 SPIN_RCPOOL 0 0 0 0 0 0 0
1 SPIN_ACF_ATH_LOG_FLUSH_WAIT 0 0 0 0 0 0 0
1 SPIN_WTHR_READY 144 0 0 0 100 0 0
1 SPIN_IICD 0 0 0 0 0 0 0
1 SPIN_TAS_NAME_HASH 0 0 0 0 0 0 0
1 SPIN_TAS_IOINFO 0 0 0 0 0 0 0
1 SPIN_RECR_LIST 0 0 0 0 0 0 0
1 SPIN_SLAB_PEND 0 0 0 0 0 0 0
1 SPIN_TEST2 0 0 0 0 0 0 0
1 SPIN_LOGNET_POOL 3 0 0 0 100 0 0
1 SPIN_FB_COPY 0 0 0 0 0 0 0
1 SPIN_LOGNET_WRITE 1 0 0 0 100 0 0
1 SPIN_SHP_ALLOC 0 0 0 0 0 0 0
1 IN_SHP_ALLOC_LC 214 0 0 0 100 0 0
1 SPIN_SHP_ALLOC_SUPER 17 0 0 0 100 0 0
각 항목에 대한 설명은 다음과 같습니다.
항목
설명
INST_ID
Tibero 인스턴스 정보 (TAC DB 질의 쿼리)
NAME
Spin Lock의 종류
GETS
최초 시도에서 Spin Lock 획득을 요청한 경우 값을 Gets값을 1씩 증가
MISSES
최초 시도에서 Spin Lock 획득에 실패한 경우 Misses값을 1씩 증가
SPIN_GETS
Spin Lock을 잡을 때까지 실패한 횟수를 의미하며 실패할 경우 1씩 증가
SLEEPS
슬립 상태에 빠질때마다 1씩 증가
Hit Ratio
적중률
WAIT_TIME
Spin Lock을 기다린 총 슬립 시간
WT
WAIT_TIME을 백분율로 표현한 항목
다음은 Spin Lock Contention을 발생할 수 있는 파라미터에 대한 설명입니다.
Shared Pool
SPIN_SHP_ALLOC
관련 파라미터
_SHARED_POOL_ALLOC_CNT(기본값 : 1)
설명
Shared Pool를 여러 개로 쪼갤 수 있고 몇 개의 allocator로 나누어 관리할지를 결정한다. 최고 15까지 설정 가능하며 설정값이 클수록 Contention은 줄지만 메모리 사용 효율은 떨어 진다.
SPIN_ALLOC_LRU
관련 파라미터
_SHARED_POOL_LRU_PER_ALLOC(기본값 : 4)
설명
하나의 Shared Pool Allocator에서 사용할 LRU list 개수를 결정한다.
2^n 값으로 설정해야 성능 저하가 줄어들며 설정값이 클수록 Contention은 줄지만 메모리 사용 효율은 떨어진다.
SHARED_POOL_LRU_PER_ALLOC 설정 값을 늘려 LRU가 늘었음에도 Contention 이 높다면
SHARED_POOL_ALLOC_CNT 늘려준다.
하지만 SHARED_POOL_ALLOC_CNT의 경우 여유있는 Allocator가 있더라도 Full인 Allocator를 사용할 수 있다는 문제점이 있다.
두 개의 파라미터를 곱했을 때 LRU 개수가 총 16개까지 가능하며 최신 버전에서는 15개까지 설정 가능하다.
SPIN_RECR_HANDLE_POOL
관련 파라미터
_RECR_HANDLE_FREELIST_CNT(기본값 : 8)
설명
DD Cache와 라이브러리 Cache에서 사용하는 구조체의 Free List 개수를 설정한다.
DD와 라이브러리가 메모리에서 사라질 수 있기 때문에 Handle이라는 구조체를 사용하며 매번 생성은 오버헤드가 크기 때문에 Pool로 관리한다.
WLOCK
SPIN_WLOCK
관련 파라미터
_WLOCK_BUCKETSET_CNT(기본값 : 64)
_WLOCK_BUCKET_PER_SET(기본값 : 1)
설명
wlock을 찾을 때 사용할 Hash Bucket의 Bucketset 개수를 결정한다.
Bucketset 별로 Spin Lock이 있으므로 개수가 늘어날수록 Contention이 줄어들지만 Hash Table 이 커지므로 메모리 사용량이 늘어난다.
Spin Lock만 늘려준다면 해당 파라미터만 늘려주고 전체적으로 분산을 원한다면
_WLIST_FREELIST_CNT 파라미터값도 같이 늘려준다.
wlock을 찾을 때 사용할 Hash Bucket의 Bucketset 개수를 결정합니다.
Bucketset별로 Spin Lock이 있으므로 개수가 늘어날수록 Contention이 줄어들지만 Hash Table이 커지므로 메모리 사용량이 늘어납니다. Spin Lock만 늘려준다 면 해당 파라미터만 늘려주고 전체적으로 분산을 원한다면 _WLIST_FREELIST_CNT 파라미터값도 같이 늘려줍니다.
SPIN_WLIST_FREELIST
관련 파라미터
_WLIST_FREELIST_CNT(기본값 : 8)
설명
wlock 또는 Buffer Cache에서 사용하는 구조체 Pool에서 Freelist의 개수를 결정한다. 설정값은 2 ^ n 값을 권장한다.
Buffer Cache
SPIN_BUF_WS / SPIN_BUF_WS_CKPT
관련 파라미터
_DB_BLOCK_LRU_LATCHES(기본값 : cpu 개수 * 3)
설명
Buffer Cache에서 사용할 LRU의 개수로 Workingset 값을 결정한다
SPIN_BUF_BUCKET
관련 파라미터
_DB_BLOCK_HASH_BUCKETS(기본값 : 131091)
_DB_BLOCK_HASH_LATCHES(기본값 : 131091)
설명
_DB_BLOCK_HASH_BUCKETS 파라미터 설정으로 Buffer Cache에서 특정 Buffer 를 찾을 때 사용할 Hash Bucket 개수를 결정한다.
_DB_BLOCK_HASH_LATCHES 파라미터 설정으로 Buffer Cache에서 사용하는 Hash에서 사 용할 Latch 개수를 결정한다.
Contention이 심하면 BUCKETS와 LATCHES값을 같게 할 수 있으나 Bucket마다 Latch가 있게 되어 메모리 효율은 떨어지게 된다.
Redo
SPIN_REDO_COPY
관련 파라미터
_LOG_SIMULTANEOUS_COPIES(기본값 : cpu 개수 * 2)
설명
Redo 버퍼에서 동시에 Copy 하는 트랜잭션의 개수를 설정한다.
Undo
SPIN_USGMT_HASH
관련 파라미 터
_USGMT_HASH_CNT(기본값 : 32)
설명
Undo 세그먼트의 Spin Lock Hash Bucket 수를 설정한다.
Spin Lock Hash Bucket 수를 늘려도 메모리를 많이 사용하지 않으므로 최소 64로 설정하는 것을 권장한다.
DD Cache
SPIN_DD_CACHE_BUCKET
관련 파라미터
_DD_BUCKETSET_CNT(기본값 : 16)
_DD_BUCKET_PER_SET(기본값 : 64)
설명
wlock과 거의 동일하게 Hash Bucket과 Bucketset의 개수를 결정한다.
PP Cache
SPIN_PPC_BUCKET
관련 파라미터
_PPC_BUCKET_CNT(기본값 : 1)
설명
wlock과 거의 동일하게 Hash Bucket 개수를 결정한다
Temp
SPIN_TEMP_UNIT_POOL_TF Temp 파일당 하나의 Spin Lock이 할당되며 여러 세션에서 Temp Tablespace를 사용할 경우 발생합니다. 해당 Spin Lock Contention이 비정상적으로 높을 경우 Temp Tablespace에 Temp 파일을 여러 개 추가하여 해결합니다.
Last updated