8. Oracle Shared Server 튜닝
- 목표
> Oracle Shared Server 환경에서의 유저 관리 문제 식별
> 성능 최적화를 위한 Oracle Shared Server 환경 구성
> Oracle Shared Server 프로세스를 사용하여 성능 문제 진단 및 해결
- 디스패처 모니터
> 서버가 디스패처를 자동으로 시작하거나 정지하지 않기 때문에 디스패처 사용률을 모니터해야 한다.
> v$shared_server_monitor
>> 연결 및 세션 제한과 세션의 현재 사용현황을 확인할 수 있다.
>> sessions 가 디스패처에 대한 실제 제한보다 적게 설정되어 있으면 sessions 파라미터 값이 기본적으로 maximum_connections 의 값으로 설정된다.
> v$dispatcher
>> 디스패처 경합 식별
select network Protocol, status,
sum(owned) Client,
sum(busy) * 100 / (sum(busy) + sum(idle)) Busy_Rate
from v$dispatcher
group by network, status;
> 디스패처의 사용률이 50%를 넘으면 디스패처 수의 증가 고려
유저는 해당 세션이 끝날 때까지 동일한 디스패처에 바인드 되므로 새로 연결할 경우에만 새 디스패처를 사용할 수 있다.
ALTER SYSTEM SET dispatchers = 'protocol, number';
> 유저 세션 대기 여부 조회, 평균 대기 시간은 1/100 초 단위로 나타난다.
select decode(sum(totalq), 0, 'No Responses', sum(wait) / sum(totalq)) avg_wait_time
from v$queue q, v$dispatcher d
where q.type = 'DISPATCHER'
and q.paddr = d.paddr;
> v$dispatcher_rate
- Shared Server 모니터
> max_shared_servers 값이 현재 사용 가능한 서버 수보다 높으면 기존의 Shared Server 가 사용되고 있을 때 PMON 백그라운드 프로세스가 Oracle Shared Server 프로세스를 동적으로 시작한다.
그리고, Shared Server 가 Idle 상태에 있을 때 Shared Server 수가 shared_servers 에 도달할 때까지 PMON 이 Shared Server 를 제거한다.
다음 명령을 사용하여 Shared Server 를 추가하거나 제거한다.
ALTER SYSTEM SET SHARED_SERVERS = number;
> v$shared_server
select name, requests,
busy * 100 / (busy + idle), status
from v$shared_server
where status != 'QUIT';
> v$queue
select decode(totalq, 0, 'No Requests', wait/totalq || 'hundredths of seconds')
from v$queue
where type = 'COMMON';
- 문제 해결
> Shared Server 를 사용하면 startup 및 shutdown 과 같은 권한이 필요한 작업을 수행할 수 없다. 이 경우 Dedicated Server 를 사용해야 한다.
> 배치 작업 등 사용률이 많은 작업은 Dedicated Server 를 사용해야 한다.
- 관련 Dictionary
> v$circuit : 데이터베이스에 대한 유저 연결 정보
> v$dispatcher : 디스패처 프로세스에 대한 정보
> v$dispatcher_rate : 디스패처 프로세스에 대한 비율 통계
> v$queue : 다중 스레드 메시지 큐에 대한 정보
> v$shared_server_monitor : Shared Server 연결을 튜닝하는데 유용한 정보
> v$shared_server : Shared Server 프로세스에 대한 정보
> select d.network, d.name disp, s.username oracle_user, s.sid, s.serial#,
p.username os_user, p.terminal, s.program
from v$dispatcher d, v$circuit c, v$session s, v$process p
where d.paddr = c.dispatcher(+)
and c.saddr = s.saddr(+)
and s.paddr = p.addr(+)
order by d.network, d.name, s.username;
'ORACLE' 카테고리의 다른 글
Oracle 데이터베이스 신규 취약점 주의 (0) | 2012.05.10 |
---|---|
오라클 12년도 교육 과정 (0) | 2012.03.08 |
쿼리문이 제대로 Index를 타는지 확인하는 방법 (0) | 2008.03.27 |
Oracle ERP에서 사용하는 DB관련 작업 (0) | 2007.10.22 |
Oracle Database 학습법 (0) | 2007.09.12 |