http://forums.oracle.com/forums/thread.jspa?threadID=664391&tstart=0

http://www.oracle-base.com/articles/10g/Services10g.php#jobs_and_services

11g 에서는 instance_id 가 추가된다고는 하지만..10g에서는 꽁수로 가능함



Posted by maceo

01 1, 2009 14:50 01 1, 2009 14:50
, ,
Response
No Trackback , No Comment
RSS :
http://merritt.co.kr/tt/rss/response/129

10.2.0.4 패치에서 workload capture 까지는 지원하나 capture파일의 재생은 11g에서만 가능하다고 하는군. 젠장 -_-;;;;

http://www.dbta.com/e-edition/Dec08/13-column_kumar.html

혹시 모르니 오라클에 물어나볼까나....

Posted by maceo

12 29, 2008 01:26 12 29, 2008 01:26
, ,
Response
No Trackback , No Comment
RSS :
http://merritt.co.kr/tt/rss/response/128

IO 부하 경감을 위한 KEEP Pool의 활용


여러 사람들의 이야기를 들어보니 Oracle의 Multi Buffer Pool 기능을 잘 사용하지 않는다고들 한다. 그런데 우리 사이트처럼 상당한 량의 Online Transaction과 Batch가 함께 도는 사이트에서는 Multi Buffer Pool이 유용하게 쓰일 수 있다.

일반적으로 KEEP Pool은 항상 read가 일어나야 하는 조그만 테이블들을 KEEP하는 용도라고 알려져 있다. 하지만 우리 사이트에서는 다르게 사용한다. 

Batch와 Online에서 다 같이 많이 쓰는 "큰" 테이블/인덱스들을 KEEP에 올려놓는다.

1. table full scan 으로 테이블을 읽으면 touch count도 올라가지 않을 뿐 아니라 buffer cache의 끝부분에 올라갈 가능성이 높다. (http://ukja.tistory.com/133 참조) 하지만 상대적으로 여유가 많은 KEEP으로 보내게 되면 메모리에 좀 더 오래 머물러 있을 가능성이 높다.

2. 이 테이블을 online에서도 다양한 파라미터로 index range scan하거나 table access by rowid를 할 때 해당 블럭들은 touch count가 높아지면서 KEEP에 좀 더 오래 머물러 있을 가능성이 높아진다. 

KEEP사이즈보다 더 크게 오브젝트를 KEEP해도 무방하다.
KEEP도 기본 버퍼풀과 동일한 알고리즘으로 움직인다. 모자라다고 해서 에러를 내지는 않는다. 오히려 이렇게 하는게 더 좋은 것 같다. full scan이 발생하는 테이블이라고 해서 언제나 모든 블럭이 메모리에 있어야 하는 것은 아니다. 그 중에서 range scan이 많이 들어오는 블럭들은 KEEP에도 오래 머물것이고, 다른 테이블에 대한 full scan이 들어올때는 touch count 가 높아져 있는 블럭들을 제외한 나머지 블럭들은 영역을 내줘도 괜찮은 것 같다.

Recyle Pool 에는 사이즈 크고 가끔 쓰는 테이블들을 올려놓는다.
이를테면 email 발송 솔루션의 발송 대상 테이블 같은 것들이다. (원래는 박스 자체를 분리해야하나..-_-)

정리하자면,

online과 batch가 함께 도는 환경에서는
1. onoline/batch에서 다 같이 자주 쓰는 "큰" 테이블은 KEEP
2. batch에서만 가끔 쓰는 테이블은 Recycle에 넣어서 full scan의 영향도를 최소화하자.

(KEEP에 큰 테이블을 넣는 것은 사실 상식에 반하는 것인데.. 좀 더 검증이 필요하다. KEEP에 넣는 오브젝트들을 다양하게 조절하면서 v$buffer_pool_statistics, v$db_cache_advice의 변화를 계속 관찰하자.)


Posted by maceo

12 27, 2008 02:11 12 27, 2008 02:11
, , ,
Response
No Trackback , a comment
RSS :
http://merritt.co.kr/tt/rss/response/127

PX COORDINATOR FORCED SERIAL 이 뜰 경우

병렬 쿼리에서 FORCED SERIAL 이 뜨면서 병렬로 실행이 못되는 경우가 있다.

이럴 때는 쿼리에서 쓰인 Stored Function 을 의심해보자.

Function 중에 parallel_enable 이 되어 있지 않은 놈이 있다면 parallel_enable 을 붙여준다!

자세한 것은 포이어슈타인의 오라클 PL/SQL 프로그래밍을 참조!!!


Plan Table                                                                 
----------------------------------------------------------------------------
| Operation                                 | Name                         |
----------------------------------------------------------------------------
|  PX COORDINATOR FORCED SERIAL             |                              |
|   PX SEND QC (RANDOM)                     |:TQ10010                      |
|    FILTER                                 |                              |
|     HASH GROUP BY                         |                              |
|      PX RECEIVE                           |                              |
|       PX SEND HASH                        |:TQ10009                      |
|        HASH GROUP BY                      |                              |
|         HASH JOIN RIGHT OUTER             |                              |
|          BUFFER SORT                      |                              |
|           PX RECEIVE                      |                              |
|            PX SEND BROADCAST              |:TQ10000                      |
|             VIEW                          |                              |
|              SORT GROUP BY                |                              |
|               TABLE ACCESS BY GLOBAL INDEX|TR_ORD_PRD                    |
|                INDEX RANGE SCAN           |IX5_TR_ORD_PRD                |
|          VIEW                             |                              |
|           HASH GROUP BY                   |                              |
|            PX RECEIVE                     |                              |
|             PX SEND HASH                  |:TQ10008                      |
|              HASH GROUP BY                |                              |
|               HASH JOIN RIGHT OUTER       |                              |
|                PX RECEIVE                 |                              |
|                 PX SEND HASH              |:TQ10006                      |
|                  PX BLOCK ITERATOR        |                              |
|                   TABLE ACCESS FULL       |MB_PRVT_MEM                   |
|                PX RECEIVE                 |                              |
|                 PX SEND HASH              |:TQ10007                      |
|                  HASH JOIN RIGHT OUTER BUF|                              |
|                   PX RECEIVE              |                              |
|                    PX SEND HASH           |:TQ10004                      |
|                     PX BLOCK ITERATOR     |                              |
|                      TABLE ACCESS FULL    |MB_MEM_MG_GR                  |
|                   PX RECEIVE              |                              |
|                    PX SEND HASH           |:TQ10005                      |
|                     HASH JOIN RIGHT OUTER |                              |
|                      PX RECEIVE           |                              |
|                       PX SEND HASH        |:TQ10002                      |
|                        VIEW               |                              |
|                         HASH UNIQUE       |                              |
|                          WINDOW SORT      |                              |
|                           PX RECEIVE      |                              |
|                            PX SEND HASH   |:TQ10001                      |
|                             PX BLOCK ITERA|                              |
|                              TABLE ACCESS |MB_MEM_HIST                   |
|                      PX RECEIVE           |                              |
|                       PX SEND HASH        |:TQ10003                      |
|                        PX BLOCK ITERATOR  |                              |
|                         TABLE ACCESS FULL |MB_MEM                        |
----------------------------------------------------------------------------

Posted by maceo

12 18, 2008 22:22 12 18, 2008 22:22
, ,
Response
No Trackback , No Comment
RSS :
http://merritt.co.kr/tt/rss/response/124

pga_aggregate_target은 limit 이 아님


아무리 pga_aggregate_target 을 정해놓더라도 빡센거 돌면 그거 넘어서서 PGA 할당한다.
over allocation 가능하다는 말씀. 그러면 얼마나 할당할 수 있느냐? Oracle 버전에 따라 다르다. 아래 링크 참고

http://www.pythian.com/documents/Working_with_Automatic_PGA.ppt

Five Tuning Tips For Your Data Warehouse 

기타 여러가지 좋은 팁들이 많다...

Posted by maceo

12 18, 2008 19:49 12 18, 2008 19:49
,
Response
No Trackback , No Comment
RSS :
http://merritt.co.kr/tt/rss/response/123

대량 DML 로 인한 gc 대기 잡기

갑자기 DB가 Hang이 걸리거나 WAS에서 큐가 마구 쌓일 때, 일단 대기를 살펴보자.

잽싸게

create table pnc$active_ses as
select * from v$active_session_history


를 해놓고 초단위로 IO, User, Cluster, Concurrency , Other등의 Wait Class 별로 발생빈도를 측정한다. 그러면 어떤 순서로 대기가 발생했는지 알 수 있고 DB에서 무슨 일이 벌어졌는지 실마리를 잡을 수 있다.

어제 대량 DML 로 인한 gc 대기를 그렇게 잡았다.

위의 방식으로 살펴보니 instance 레벨에서 Cluster 대기가 엄청 발생하고, 그 후에 Concurrency 가 발생했다. 주로 gc cr current block-2way 와 gc cr request 가 먼저 왕창 생기고 그 후에 latch: cache buffer chains 가 발생했는데...

http://wiki.ex-em.com/index.php/Gc_cr/current_block_2-way 참고
http://wiki.ex-em.com/index.php/Gc_cr/current_request 참고

current block 인 것으로 보아 갑자기 대량 DML이 발생한 것 같아서 여기저기 수소문해보니 그런 일이 있었다. 업무적으로 이걸 막기는 힘든 상황.. 마침 gc cr block lost 도 많이 보여서 UDP 패킷 사이즈를 체크.

* gc cr/current request - Tuning
 
비효율적인 네트워크 설정
 - Gigabit Ethernet Interconnect에서는 UDP(User Diagram Protocol) 사용
 - 확인 방법 :
 SQL> oradebug setmypid
 SQL> oradebug ipc
 SQL> oradebug tracefile_name
 
[예제]
PCSDB1:SQL>oradebug setmypid
Statement processed.
PCSDB1:SQL>oradebug ipc
Information written to trace file.
PCSDB1:SQL>oradebug tracefile_name
/cs_orahome/oracle/10.2.0/admin/PCSDB1_csdb1/udump/pcsdb1_ora_11771.trc
PCSDB1:SQL>exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining Scoring Engine options
[PCSDB1] /cs_orahome/oracle/10.2.0/rdbms/admin> vi /cs_orahome/oracle/10.2.0/admin/PCSDB1_csdb1/udump/pcsdb1_ora_11771.trc
 
* 결과
locked 1
blocked 0
timed wait receives 0
admno 0xfe8bc48 admport:
SSKGXPT 0x217880 flags SSKGXPT_READPENDING      socket no 8     IP 10.1.1.1     UDP 58379
context timestamp 0
        no ports
 
 - RAC Interconnect 성능과 가장 연관 있는 것은 UDP Buffer Size.
 - 오라클 권장 UDP buffer size = 256K
 - UDP Buffer Size가 작으면 패킷유실(Packet loss) 현상이 발생. (gc cr/current block lost 발생)
 
 * 패킷 유실 확인
 [PCSDB1] /cs_orahome/oracle> netstat -s -p udp
udp:
        57726 incomplete headers
        4795 bad checksums
        52931 socket overflows
 
 
# 아래 metalink 문서에서는 HP-UX서버에서는 UDP 튜닝이 안되는걸로 확인됨
 1.문서변경 : Reference site확인결과
 UDP Send buffer size는 64K로 Fix되어 다른 값으로 변경 할 수 없고
 UDP Receive buffer size는 ndd명령으로 변경가능함
 
 2. Reference Site size
 - 메리츠 증권 : 1M
 - 신한은행 : 2G
 - SKT : 1M

OS 커널 파라미터를 UDP 패킷 버퍼 1M 로 변경하고 나니 문제 해결~~~

오늘의 교훈

뭔 일이 생기면 일단 active_session_history 를 덤프떠놓고 세심하게 분석해보자!!

Posted by maceo

12 18, 2008 19:46 12 18, 2008 19:46
, , ,
Response
No Trackback , No Comment
RSS :
http://merritt.co.kr/tt/rss/response/122

SGA 가 춤을 출 때

SGA에서 shared pool 과 buffer cache 가 커졌다 작아졌다 난리부르스를 출 때...

확인은

select *
from (
    select INST_ID,
      COMPONENT,
      OPER_TYPE,
      OPER_MODE,
      PARAMETER,
      INITIAL_SIZE,
      TARGET_SIZE,
      FINAL_SIZE,
      (final_size-initial_size)/1024/1024 as delta_mb,
      STATUS,
      START_TIME,
      END_TIME
    from GV$SGA_RESIZE_OPS
    where inst_id=1
    order by inst_id, END_TIME desc)
where rownum <= 50

만약 buffer cache 가 GROW 하고 shared pool이 줄어들 때 shared pool 쪽에서 library cache pin 이 일어날 수 있다. 잘못하면 이거 안풀리고 DB가 Hang까지 갈 수 있다.

왜 이런 일이 일어날까? 10g 에서부터 buffer cache 가 커지면 shared pool 의 영역을 일부 뺏어와서 쓰게 된다. 이 영역을 KGH: NO ACCESS 영역이라고 한다.

Resizing the SGA « Oracle Scratchpad 참고

오라클은 KGH: NO ACCESS 영역을 찜해놓고, 그 안에 있는 LCO를 바로 clean out 하지는 않는다. 그렇게 하기도 어렵고 대단히 무리한 CPU Operation 이 될 수 있기 때문이다. 그래서 영역을 일단 찜하고 그 안에 있는 LCO들이 unpin되면 그 영역을 buffer cache로 점진적으로 가져온다. 이럴 때 위의 쿼리에서 OPER_MODE 가 DEFFERED 로 찍힌다.

그러면 왜 library cache pin이 일어날까?

이건 추측인데... 메모리를 KGH: NO ACCESS 로 표시할 때 그 안에 들어가있는 LCO 들에 대해서 어떤 플래그를 달아야 하는데, 그 때 pin 이 걸리는게 아닐까 싶다. 확인할 길은 없다. 물론 영역 크기가 크면 자주 호출되는 LCO 가 걸려들 가능성이 높을거고 그때 pin 이 걸리겠지.


또 하나 관찰한 흥미로운 증상은, SGA Max > SGA Target 일 때 SGA resize가 더욱 빈번하게 일어난다는 거다. 거의 1~2분에 한번씩 일어나서 오라클 버그로 의심했으나

Simple Is Beautiful | SHARED POOL中KGH: NOACCESS占用大量内存的问题分析  참고

우리가 쓰는 10.2.0.3 에서는 패치가 되었다고 Oracle SR 결과 확인이 되었다. 그래서 궁여지책으로 SGA Max = SGA Target 으로 맞추고 나니 증상이 훨씬 덜해졌다. 이건 또 왜 이런걸까??

그리고.. SGA Max > SGA Target 으로 설정해놓고 몇G의 여유분을 놔둔다 하더라도 쎈 배치가 돌거나 어떤 일이 생기면 SGA Target을 넘어서서까지 메모리를 할당을 하는 것 같다. PGA도 pga_aggregate_target을 넘어서서 할당을 하는데 (v$pga_target_advice뷰의 over allocation참조) SGA Target도 마찬가지인듯. 그리고 Target을 넘어서서 메모리를 사용하고 나면 자동적으로 Target까지 shrink 를 시도하는게 아닌가 한다.

살펴보니 추측투성이네~

결론은...

ASSM쓸거면 SGA Max = SGA Target으로 해놓자.

이다.

Posted by maceo

12 18, 2008 19:30 12 18, 2008 19:30
, ,
Response
No Trackback , No Comment
RSS :
http://merritt.co.kr/tt/rss/response/121


블로그 이미지

가늘어도 긴놈이 장땡

- maceo

Archives

Authors

  1. maceo

Calendar

«   3 2010   »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

Site Stats

Total hits:
170288
Today:
32
Yesterday:
47