520 likes | 561 Views
Make a Real DBA. 인스턴스 튜닝. ㈜ 신한시스템즈. 김 종 근. 인스턴스 튜닝. 메모리 히트율과 SGA 사이즈 결정 대기 이벤트 모니터 Latch 와 Enqueue Q & A. 메모리 히트율과 SGA 사이즈 결정. SGA 의 구조 히트율 측정 SGA 사이즈 결정. System Global Area. Database Buffer Cache. Redo Log Buffer. Shared Pool. SHARED_POOL_SIZE. DB_CACHE_SIZE.
E N D
Make a Real DBA 인스턴스 튜닝 ㈜ 신한시스템즈 김 종 근
인스턴스 튜닝 • 메모리 히트율과 SGA 사이즈 결정 • 대기 이벤트 모니터 • Latch와 Enqueue • Q & A
메모리 히트율과 SGA 사이즈 결정 • SGA의 구조 • 히트율 측정 • SGA 사이즈 결정
System Global Area Database Buffer Cache Redo LogBuffer Shared Pool SHARED_POOL_SIZE DB_CACHE_SIZE DB_KEEP_CACHE_SIZE SHARED_POOL_RESERVED_SIZE DB_KEEP_RECYCLE_SIZE System Global Area(SGA) LOG_BUFFER
Shared Pool System Global Area Library Cache Database Buffer Cache Redo LogBuffer Shared Pool Dictionary Cache User Global Area • Library Cache: 공유 SQL 및 PL/SQL 코드 저장 • Dictionary Cache: 데이터 딕셔너리 객체 정의 보유 • User Global Area: 공유 서버 모드에서 세션 정보 저장
DB Buffer Cache System Global Area Database Buffer Cache Redo LogBuffer Shared Pool • DB Buffer Cache: 데이터 파일의 데이터 블록의 복사본 보유 • LRU 알고리즘에 의해 관리
Redo Log Buffer System Global Area Database Buffer Cache Redo LogBuffer Shared Pool • Redo Log Buffer: 데이터베이스에 적용된 변경사항(리두항목)이 기록되는 영역
Library Cache Dictionary Cache Shared Pool • 다른 메모리 영역에서의 캐시 실패보다 공유 풀에서 캐시 실패가 비용이 높다. • 라이브러리 캐시의 튜닝에 초점을 맞춘다. • 사이즈가 작은 경우 CPU 소모가 많고, 경합이 많이 발생할 수 있다. • 사이즈가 큰 경우 단편화 관리를 위한 오버헤드가 발생
Library Cache Tuning Point • 구문 분석을 최소화하여 실패(miss)를 줄인다. • 공유할 수 있도록 문장을 작성한다. • 충분한 공간 할당을 통해 문장이 삭제(age out)되지 않도록 한다. • 무효화가 일어나지 않도록 한다. • 메모리 단편화를 제거한다. - 대용량 메모리 요구 사항에 대비한 공간 예약 - 자주 사용되는 대형 객체 고정 - 익명의 대형 PL/SQL 블록 제거
Library Cache Hit Ratio • Hit Ratio = Get Hits / Gets │ │ │ └ 요청에 대해 캐시에서 찾은 총 회수 │ └ 해당 항목을 요청한 총 회수 SQL> select gethitratio 2 from v$librarycache 3 where namespace = 'SQL AREA'; GETHITRATIO ----------- .841509596
Finding Sharable SQL SQL> select users_executing, executions, loads, substr(sql_text, 1, 200) 2 from v$sqlarea where rownum < 100 3 order by upper(sql_text); USERS_EXECUTING EXECUTIONS LOADS --------------- ---------- ---------- SUBSTR(SQL_TEXT,1,80) -------------------------------------------------------------------------------- 0 62 1 SELECT * FROM webmgr.webyaa WHERE idno = '' 0 2 4 SELECT * FROM webmgr.webyaa WHERE idno = 'DTSWCY32' 0 1 1 SELECT * FROM webmgr.webyaa WHERE idno = 'NAJICY' 0 8 3 select 'X' from BIDMGR.BIDUSR where (CPCD=trim(:b0) and USID=trim(:b1)) 0 3006 2 select 'X' from ICPMGR.ICPNCH where (CPCD=trim(:b0) and CNNO=trim(:b1)) 0 1 2 select 'x' from dual : :
Library Cache Reloads • Reload: 실행단계에서의 캐시 실패로 인한 재구문 분석 • Reloads Ratio = Reloads / Executions │ │ │ └ 실행 단계에서의 캐시 실패가 발생한 총 회수 │ └ 객체를 읽거나 실행한 총 회수 SQL> select sum(pins) "Executions", sum(reloads) "Cache misses", sum(reloads)/sum(pins) 2 from v$librarycache; Executions Cache misses SUM(RELOADS)/SUM(PINS) ---------- ------------ ---------------------- 8662143 19285 .002226354
Large Memory Reserve • 사이즈가 큰 오브젝트를 위한 공간을 마련한다. • SHARED_POOL_RESERVED_SIZE 파라미터 사용 • Default: Shared_Pool_Size의 5% SQL> SELECT free_space, avg_free_size, used_space, 2 avg_used_size, request_failures, last_failure_size 3 FROM v$shared_pool_reserved; FREE_SPACE AVG_FREE_SIZE USED_SPACE AVG_USED_SIZE REQUEST_FAILURES LAST_FAILURE_SIZE ---------- ------------- ---------- ------------- ---------------- ----------------- 105334360 43383.1796 11096240 4570.11532 0 0 - request_misses가 0으로 유지되도록 하는게 목표 - REQUEST_FAILURES>0 면 사이즈가 작은 것 - FREE_SPACE=>SHARED_POOL_RESERVED_SIZE/2 이면 큰 것
Large Object Pinning • 자주 사용되는 큰 객체는 캐시 내에 고정 SQL> select * from v$db_object_cache 2 where sharable_mem > 10000 3 and type in ('PACKAGE','PACKAGE BODY', 'FUNCTION', 'PROCEDURE') 4 and kept = 'NO'; OWNER NAME NAMESPACE TYPE SHARABLE_MEM LOADS EXECUTIONS … ------- --------------- --------------- ---------- ------------ ----- ---------- SYS DBMS_OUTPUT TABLE/PROCEDURE PACKAGE 14023 7 0 … SALMGR SF_IOIL TABLE/PROCEDURE FUNCTION 12794 7 0 SYS DBMS_STANDARD TABLE/PROCEDURE PACKAGE 27737 3 8 SALMGR SF_TARF_ARN3 TABLE/PROCEDURE FUNCTION 11219 5 421 LIAMGR LIASTAYPERIOD TABLE/PROCEDURE FUNCTION 21868 1 9 SALMGR SF_TARF_ARN4 TABLE/PROCEDURE FUNCTION 11591 5 421 SQL> @?/rdbms/admin/dbmspool.sql SQL> execute dbms_shared_pool.keep(‘dbms_standard’);
Dictionary Cache Tuning • 캐시 실패(miss)를 줄인다. - 실패율이 15% 이내에 있도록 한다. - 라이브러리 캐시의 튜닝 여부를 점검한다. SQL> SELECT SUM(gets), SUM(getmisses), 2 SUM(getmisses)*100/SUM(gets) "GetMissRatio" 3 FROM v$rowcache; SUM(GETS) SUM(GETMISSES) GetMissRatio ---------- -------------- ------------ 35926 328 .912987808
Shared Pool Sizing • SHARED_POOL_SIZE = ? (Obj Mem + SQL Mem + Cursors) * 1.2 공유 SQL의 사이즈 오버헤더 객체 정의에 할당된 메모리 오픈된 커서에 할당된 메모리
Shared Pool Sizing • 패키지, 뷰과 같은 내장 객체: SQL> select sum(sharable_mem) 2 from v$db_object_cache; SUM(SHARABLE_MEM) ----------------- 924308904 • SQL 문: SQL> select sum(sharable_mem) 2 from v$sqlarea where executions > 5; SUM(SHARABLE_MEM) ----------------- 59959149
Shared Pool Sizing • 사용자당 열린 커서별로 약 250Bytes 필요: SQL> select sum(250*users_opening) 2 from v$sqlarea; SUM(250*USERS_OPENING) ---------------------- 50120300 SHARED_POOL_SIZE = (924308904+59959149+50120300)*1.2 = 1241266023
DB Buffer Cache • SQL 튜닝을 통해 액세스 블록 수를 줄인다. • 액세스 특성을 구분한다. • 메모리에 캐시할 테이블을 구분한다.
DB Buffer Cache Hit Ratio • Hit Ratio = Physical Reads / All Reads │ └ 전체 블록 읽기 회수 │ │ │ └ 물리적 디스크 읽기 회수 SQL> select 1-(phy.value-lob.value-dir.value)/ses.value "CacheHitRatio" 2 from v$sysstat ses, v$sysstat lob, v$sysstat dir, v$sysstat phy 3 where ses.name = 'session logical reads' 4 and dir.name = 'physical reads direct' 5 and lob.name = 'physical reads direct (lob)' 6 and phy.name = 'physical reads’; CacheHitRatio ------------- .982277269
Buffer Cache Tuning Point • 히트율 99%는 잘 못 튜닝된 데이터베이스에서도 나올수 있다. • 대기 이벤트를 통하여 병목의 원인을 파악한다. • SQL 문장을 튜닝한다. • 버퍼 캐시 사이즈를 늘린다.
다중 버퍼 풀 • 오브젝트의 특성에 따라 캐시 영역을 분류 캐시에서 가능한 빨리 제거될 오브젝트 RECYCLE POOL 캐시에서 가능한 오래 유지될 오브젝트 KEEP POOL 일반적인 오브젝트 DEFAULT POOL
다중 버퍼 풀 사용 • 오브젝트의 특성에 따라 캐시 영역을 분류 CREATE TABLE a … STORAGE( BUFFER_POOL recycle … ); DB_RECYCLE_CACHE_SIZE ALTER TABLE b … STORAGE( BUFFER_POOL keep … ); DB_KEEP_CACHE_SIZE ALTER TABLE b … STORAGE( BUFFER_POOL default … ); DB_CACHE_SIZE
Redo Log Buffer • 서버 프로세스가 필요로 하는 공간 확보 Redo LogBuffer • 지나치게 큰 것은 자원 낭비 • 생성되는 리두의 양을 조절
Redo Log Buffer Monitor • 리두 로그 버퍼에서 발생한 대기 시간: SQL> select sid, event, seconds_in_wait, state 2 from v$session_wait 3 where event = 'log buffer space%'; SID EVENT SECONDS_IN_WAIT STATE ----- --------------------------- --------------- -------- 13 log buffer space 110 WAITING • 리두 로그 버퍼에 발생한 대기 이벤트: SQL> select r.value "Retries", e.value "Entries", r.value/e.value*100 "Percentage" 2 from v$sysstat r, v$sysstat e 3 where r.name = 'redo buffer allocation retries' 4 and e.name = 'redo entries‘; Retries Entries Percentage ---------- ---------- ---------- 35 8637338 .000405217
대기 이벤트 모니터 • 대기 이벤트 • 대기 이벤트의 종류 • 대기 이벤트를 통한 병목 지점 확인
대기 이벤트 • 공유 오브젝트에 대한 경합으로 인해 대기 현상이 발생 • 다음 작업을 하기 전에 이전 작업이 끝나기를 기다림으로 인해 발생
대기 이벤트 종류 SQL> select * from v$event_name; EVENT# NAME PARAMETER1 PARAMETER2 PARAMETER3 ------ ---------------------------------------- ----------- ---------- ----------- 0 null event 3 latch free address number tries 15 enqueue name|mode id1 id2 137 free buffer waits file# block# set-id# 139 checkpoint completed 145 buffer busy waits file# block# id 146 buffer busy global cache file# block# id 147 buffer busy global CR file# block# id 179 log file switch (checkpoint incomplete) 180 log file switch (archiving needed) 187 db file sequential read file# block# blocks 188 db file scattered read file# block# blocks 253 index block split rootdba level childdba 259 row cache read cache id address times 348 PL/SQL lock timer duration 363 rows selected
병목 지점 확인을 위한 뷰 • V$EVENT_NAME: 모든 이벤트 명 • V$SYSTEM_EVENT: 모든 세션을 합한 이벤트에 대한 전체 대기 수 • V$SESSION_EVENT: 대기해야 했던 각 세션에 대한 이벤트 대기 수 • V$SESSION_WAIT: 대기 중인 현재 활성 세션에 대한 이벤트 대기 수
병목 지점 확인(시스템) SQL> select * from v$system_event; EVENT TOTAL_WAITS TOTAL_TIMEOUTS TIME_WAITED AVERAGE_WAIT -------------------------------------- ----------- -------------- ----------- ------------ Null event 1 1 410 410 latch free 2 2 4 2 pmon timer 214428 214426 66043383 307.997943 enqueue 68 0 1396 20.5294118 control file parallel write 214184 0 93727 .437600381 checkpoint completed 1 0 8 8 buffer busy waits 1 0 11 11 log file sequential read 10 0 13 1.3 log file single write 12 0 6 .5 log file parallel write 1571 0 956 .608529599 log file switch completion 3 0 107 35.6666667 log file sync 1486 0 868 .584118439 db file sequential read 1800 0 828 .46 db file scattered read 431 0 190 .440835267 db file single write 12 0 1 .083333333 db file parallel write 771 0 1 .001297017 db file parallel read 1 0 10 10 SQL*Net message to client 179024 0 58 .000323979 SQL*Net more data to client 61 0 1 .016393443 SQL*Net message from client 179022 0 9669480 54.0128029
병목 지점 확인(세션) SQL> select * from v$session_event; SID EVENT TOTAL_WAITS TOTAL_TIMEOUTS TIME_WAITED AVERAGE_WAIT MAX_WAIT --- ----------------------------- ----------- -------------- ----------- ------------ ---------- 1 pmon timer 214596 214594 66095127 307.997945 320 5 rdbms ipc reply 1 0 1 1 1 2 rdbms ipc message 214601 214591 66094208 307.986487 314 3 rdbms ipc message 216084 214574 66094213 305.872776 316 6 rdbms ipc message 362 361 65990193 182293.351 184327 4 rdbms ipc message 214298 214290 66001759 307.990551 322 2 control file sequential read 46 0 15 .326086957 15 4 control file sequential read 28 0 0 0 0 3 control file sequential read 60 0 11 .183333333 3 3 control file parallel write 34 0 115 3.38235294 61 4 control file parallel write 214304 0 93595 .436739398 104 3 log file sequential read 7 0 7 1 2 3 log file single write 11 0 6 .545454545 3 3 log file parallel write 1571 0 956 .608529599 36 5 db file sequential read 974 0 357 .366529774 24 9 db file sequential read 37 0 28 .756756757 2 6 db file sequential read 3 0 0 0 0 5 db file scattered read 241 0 107 .443983402 10 2 db file parallel write 771 0 1 .001297017 1 2 direct path read 24 0 0 0 0 4 direct path read 36 0 0 0 0 3 direct path read 12 0 0 0 0 3 direct path write 12 0 0 0 0
Latch와 Enqueue • Latch란? • Latch의 종류 • Latch 모니터 • Enqueue란? • Enqueue의 종류 • Enqueue 모니터
Latch란? • SGA에 있는 공유 데이터구조를 보호하는 직렬화 방식 System Global Area Server Process1 LRU List Database Buffer Cache Server Process2 LRU Latch Server Process3
Latch 대기 • 자원이 사용중이면 요청한 프로세스는 대기한다. Spin or sleep System Global Area Server Process1 LRU List Database Buffer Cache Server Process2 LRU Latch Spin or sleep Server Process3
Latch 요청 방식 • Willing-to-wait • 요청 프로세스가 잠시 대기 후 다시 래치 요청 • 프로세스가 래치를 사용할 수 있을 때가지 계속 대기하면서 요청 • Immediate - 요청 프로세스가 대기하지 않고 다른 명령의 처리 진행 두 모드의 차이는 요청된 래치를 사용할 수 없을 때의 진행 방식만 틀림
Latch의 종류 SQL> select * from v$latchname; LATCH# NAME ---------- ---------------------------------------------------------------- 0 latch wait list 1 event range base latch 2 post/wait queue 3 process allocation 4 session allocation : 93 cache buffers lru chain 94 buffer pool 95 multiple dbwriter suspend 96 active checkpoint queue latch 97 checkpoint queue latch : 107 archive control 108 archive process latch 112 alert log latch 113 redo writing 114 redo copy : 239 xssinfo freelist 240 AW SGA latch 241 rows selected.
Latch 경합 모니터 • 대기 이벤트에서「latch free」의 비중을 확인 SQL> SELECT * 2 FROM v$system_event 3 WHERE event NOT IN ('pmon timer', 'smon timer', 'rdbms ipc message', 4 'SQL*Net message from client') 5 ORDER BY time_waited DESC; EVENT TOTAL_WAITS TOTAL_TIMEOUTS TIME_WAITED AVERAGE_WAIT -------------------------- ----------- -------------- ----------- ------------ db file sequential read 478770 0 7 .000014621 log file sync 113274 47 1 8.8282E-06 Null event 1 1 0 0 latch free 4833 4262 0 0 process startup 15 0 0 0
Latch 경합 모니터 • V$LATCH에서 경합 부위 확인 SQL> select name, gets, misses, sleeps, immediate_gets, immediate_misses 2 from v$latch 3 where misses > 0 or immediate_misses >0; NAME GETS MISSES SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES ------------------------- ---------- ---------- ------- -------------- ---------------- enqueues 13928533 3105 0 0 0 enqueue hash chains 17243788 1048 0 0 0 cache buffers lru chain 5101150 4719 12 40659842 17200 checkpoint queue latch 38148780 1851 0 3253596 134 cache buffers chains 2508578251 573034 11972 68638909 1548 cache buffer handles 2452968 61 0 0 0
40 최경식 부산시 남구 대연… 부산시 해운대구 우 50 이동원 부산시 중구 중앙동 70 80 60 90 이정현 김일동 홍민우 김진명 Enqueue란? • 데이터베이스 자원을 직렬화하기 위한 공유 오브젝트 System Global Area Server Process1 Server Process2 Enqueue Server Process3
40 최경식 부산시 남구 대연… 부산시 해운대구 우 50 이동원 부산시 중구 중앙동 60 70 80 90 이정현 김일동 김진명 홍민우 Enqueue 대기 • 자원이 사용 중이면 대기한다. System Global Area Server Process1 Hold Server Process2 Wait Enqueue R E Q 3 R E Q 2 R E Q 1 Server Process3 Wait
Enqueue 모니터 SQL> select * from v$lock; ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK ---------------- ---------------- ---- -- ------- ----- ----- ------- ------ ----- 0000000381912138 0000000381912158 2 MR 6 0 4 0 665125 0 00000003819120B0 00000003819120D0 2 MR 5 0 4 0 665125 0 0000000381912028 0000000381912048 2 MR 4 0 4 0 665125 0 0000000381911FA0 0000000381911FC0 2 MR 3 0 4 0 665125 0 0000000381911F18 0000000381911F38 2 MR 2 0 4 0 665125 0 0000000381911E90 0000000381911EB0 2 MR 1 0 4 0 665125 0 0000000381911CF8 0000000381911D18 3 RT 1 0 6 0 665126 0 0000000381911AD8 0000000381911AF8 4 XR 4 0 1 0 665130 0 0000000381911D80 0000000381911DA0 5 TS 2 1 3 0 665121 0 000000038126EDD0 000000038126EF48 10 TX 524295 175 6 0 10 0 0000000381255550 0000000381255578 10 TM 5978 0 3 0 10 0 11 rows selected.
Enqueue 모니터 SQL> select * from dept; DEPTNO DNAME LOC ---------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON SQL> select * from dept; DEPTNO DNAME LOC ---------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON SQL> select * from v$lock where sid > 9; no rows selected.
Enqueue 모니터 SQL> select * from dept; DEPTNO DNAME LOC ---------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON SQL> update dept 2 set loc='a' 3 where deptno = 10; 1 row updated. SQL> select * from dept; DEPTNO DNAME LOC ---------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON SQL> select * from v$lock where sid > 9; ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK ---------------- ---------------- ---- -- ------- ----- ----- ------- ------ ----- 000000038126EDD0 000000038126EF48 10 TX 524295 175 6 0 10 0 0000000381255550 0000000381255578 10 TM 5978 0 3 0 10 0 2 rows selected.
Enqueue 모니터 SQL> update dept 2 set loc='a' 3 where deptno = 10; 1 row updated. SQL> insert into dept 2 values ( 50, 'a', 'b'); 1 row created. SQL> select * from v$lock where sid > 9; ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK ---------------- ---------------- ---- -- ------- ----- ----- ------- ------ ----- 000000038126EDD0 000000038126EF48 10 TX 524295 175 6 0 120 0 0000000381255550 0000000381255578 10 TM 5978 0 3 0 120 0 0000000381265B08 0000000381265C80 14 TX 327681 178 6 0 12 0 0000000381255610 0000000381255638 14 TM 5978 0 3 0 12 0 4 rows selected.
Enqueue 모니터 SQL> update dept 2 set loc='a' 3 where deptno = 10; 1 row updated. SQL> insert into dept 2 values ( 50, 'a', 'b'); 1 row created. SQL> update dept 2 set dname = 'a' 3 where deptno = 10; SQL> select * from v$lock where sid > 9; ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK ---------------- ---------------- ---- -- ------- ----- ----- ------- ------ ----- 000000038126EDD0 000000038126EF48 10 TX 524295 175 6 0 167 1 0000000381255550 0000000381255578 10 TM 5978 0 3 0 167 0 0000000381265B08 0000000381265C80 14 TX 327681 178 6 0 59 0 0000000381255610 0000000381255638 14 TM 5978 0 3 0 59 0 0000000381911BE8 0000000381911C08 14 TX 524295 175 0 6 1 0 5 rows selected.