Admin/admin

유닉스에서 ORACLE의 자원 활용 상태 점검 방법

Qhtlr 2007. 10. 9. 16:27

유닉스에서 ORACLE의 자원 활용 상태 점검 방법
=============================================


PURPOSE
-------
이 문서의 목적은 DBA로 하여금, 오라클에 의해
사용되는 자원 활용 정도를 전반적으로 살펴보는
방법과, 자원 활용 상태를 점검하는데 사용되는
툴에 대한 설명을 기술하는데 목적이 있다.

Explanation
-----------
데이터베이스 성능은 시스템 자원 상태에 의해 제약된다. 때때로,
데이터베이스 상의 성능 문제는, 데이터베이스의 구성이나 물리 구성이
효과적으로 이루어 지지 않아 발생하는 경우가 있으며, 오라클의
트랜잭션이나 사용자나, 프로세스에 의한 비 정상적인 자원 점유에
의해 발생 하기도 한다. 데이터베이스 관리자는 기본적으로, 자원
활용 상태를 점검할 수 있어야 하며, 심각한 문제로 번지기 전에
조치를 취할 수 있어야 한다.

메모리,CPU, I/O는 오라클에서 사용하는 공통된 자원이다. 이 문서에서
위 자원들에 대한 성능 점검을 위해 사용되어 지는 툴과, 사용 방법을
기술한다. 이 자원들에 대한 성능 정보는 오라클 서버 또는 시스템에서
수집할 수 있다. DBA가 필요한 세부 정보는 시스템 관리자나, O/S 공급
업체를 통해 얻을 수 있다.

1. 오라클 인스턴스

오라클 인스턴스는, SGA (System Global Area) 및 백그라운드 프로세스
로 구성되어 있다.
SGA 할당 및 백그라운드 프로세스 기동은, ‘startup nomount’시
이루어 지게되며, 인스턴스의 특성은 다음과 같다.

- 이름은 환경변수 ORACLE_SID 값에 의해 결정된다.
- 각 인스턴스는 각자의 SGA와 백그라운드 프로세스를 사용한다.
- OPS 구성에서는 여러 인스턴스가 동일한 데이터베이스를
액세스 할 수 있다.

동일한 $ORACLE_HOME을 사용하더라도, 여러개의 오라클 인스턴스
구동이 가능하다. 여러 인스턴스를 구동 시키는 것은 디스크나, 메모리,
커널 파라미터와 같은 시스템 자원에 의해 제약을 받을 뿐, 오라클 자체의
제약 사항은 없다.
인스턴스가 구동될 때 마다, 오라클은 init<SID>.ora 파일에 지정된
파라미터에 따라 주요 자원 할당 요청을 O/S에게 한다. 각 오라클
인스턴스는 메모리상의, 공용 SGA (System Global Area) 와, 백그라운드
프로세스를 위한 PGA(Program Global Area)를 사용하게 된다.

2. 시스템 자원

1) 메모리

오라클에서 사용하는 메모리 구조에는 SGA, PGA, UGA 및 sort area가 있다.

A. Shared Memory, Semaphore
오라클에서는, 성능 향상을 위해 공유 메모리 (shared memory)를 사용한다.
O/S에서 동일한 동일한 주소의 페이지를 프로세스에서 참조할 때 마다 매번
메모리에 로스 시키지 않아도 된다. 대신, 프로세스는, 메모리 상에
올라간 데이터에 대한 주소 정보를 가지고, read/write를 수행하게
된다. 따라서, 데이터는 한 프로세스의 주소 공간 (address space) 에서
다른 프로세스의 주소 공간으로 옮겨질 필요가 없다. 데이터에 대한
정합성을 보장하기 위해, 한 시점에서 오직 한개의 프로세스만이
액세스 할 수 있어야 하는데, 이를 위해 세마포어가 사용된다.

세마포어에는 두가지 값만 설정이 가능하다. ( set / unset ) 프로세스가
메모리의 특정 위치를 참조할 때, 프로세스에서는 참조하려는
위치에 세마포어가 할당 되어 있는지여부와, 값이 set 상태인지 여부를
확인한다. 만약 세마포어가 할당되어 있고 값이 set 상태이라면,
해당 위치의 상태가 가용한 상태가 될 때까지 대기한다.

해당 메모리 영역이 액세스 가능하게 되면, 먼저 세마포어의 값을 set
상태로 만들어, 다른 프로세스에서 read/write 작업을 수행하는데
끼어 들지 못하도록 한다.

SGA의 크기는 shared pool, database buffer cache, redo log buffer,
large pool 및 java pool 크기를 더한 값으로 정해진다. 일반적으로
사용되는 SGA 크기 계산 공식은 다음과 같다.

((db_block_buffers * block size) + (shared_pool_size +
large_pool_size + java_pool_size + log_buffers) + 1MB

데이터베이스 성능 최적화를 위해, SGA는 real memory ( 시스템 메모리
에서 virtual memory 영역은 제외 ) 크기 이내로 지정되어야 하며,
real memory 크기를 초과할 경우 swapping이 발생하게 된다. SGA 크기는
OS 커널 파라미터에 의해 제약을 받게 되는데, 유닉스에서는 SHMMAX와
같은 파라미터에 의해 결정된다.

SGA는 연관된 모든 프로세스에서 액세스 가능하므로, 다중 사용자
환경에서, 여러 프로세스가 정보를 공유하기 위해 사용된다.

오라클이 사용하는 shared memoory 세그먼트와, semaphore 관련
커널 파라미터에는 다음과 같은 것들이 있다.

- SEMMNI => Semaphore set / 식별자의 최대 갯수
- SEMMNS => 시스템레벨에서 사용 가능한 semaphore의 최대 갯수
- SHMMNI => 미리 할당 가능한 shared segment의 갯수
- SHMMAX => Shared segment의 최대 크기

도움이 되는 관련 정보는 오라클 설치 가이드에 자세히 나와 았으며,
설치 가이드에 제시된 수치는, semaphore나 shared memory 관련 최소
값이다.


B. Private Memory

PGA는 하나의 서버 프로세스 또는 백그라운드 프로세스의 데이터나
컨트롤 정보를 담는 메모리 공간이다. PGA의 크기는, 데이터베이스
구성 및 프로세스의 역할에 따라 다르다. Dedicated server 구성에서는
하나의 프로세스가, 하나의 사용자 프로세스의 작업을 처리하며, PGA에
UGA의 stack 공간을 포함한다. UGA는 다시, 사용자 세션 데이터 및
커서 상태 정보, sort area 등을 포함한다.
Multithreaded server 구성에서는, 하나의 shared server가 여러개의
사용자 프로세스의 작업을 처리하며, UGA 영역은 shared pool의 일부를
차지하게 된다.


PGA는 다음과 같은 역할을 한다.

- 프로세스가 기록 가능한, 비공유 메모리 영역
- 각각의 서버 프로세스 또는 백그라운드 프로세스별로 PGA가 존재한다.
- 사용자가 연결되면, 사용자는 PGA 공간이 부족하지 않게 할당
된다. 만약 PGA 공간을 할당할 수 없으면, 아예 사용자 연결 자체가
ORA-4030 에러하 함께 실패하게 된다.


PGA 크기와 관련된 오라클 파라미터에는 다음과 같은 것들이 있다.

- open_links
- db_files
- sort_area_retained_size
- sort_area_size

현재 사용중인 PGA 크기를 구하기 위해서는 다음과 같이 한다.

SESSION PGA MEMORY => 세션의 현재 PGA크기와 관련된 통계 정보
SESSION PGA MEMORY MAX => 세션의 PGA 크기의 최대 값 통계 정보

PGA = dedicated server processes - UGA = Client machine process

모든 세션에 대한 PGA 및 UGA 메모리 크기를 조사하기 위해서는,
Bulletin No: 11842 을 참조한다.

참고 : RS/6000 플랫폼에는, 각각의 shadow process는,
PGA를 shared memory segment 영역에 저장한다.

오라클 백그라운드 프로세스를 위한 (DBWR, LGWR 등) PGA 영역 내 stack
공간의 크기는 위에 언급되지 않은 추가 파라미터들에 의해 결정된다.

2) CPU

CPU 사용은, 프로세스의 작업 유형에 따라 다르다. 시스템 상의 부하가
최대일 경우, 데이터베이스 관리자나, 시스템 관리자는 CPU 활용율이
90% 이상을 나타내는 것을 확인하게 된다. 일반적으로 데이터베이스 관리자는
시스템 부하가 일시적으로 집중되는 현상을 피하도록 할 필요가 있다.


3) I/O

I/O의 양 또한 프로세스의 작업 유형에 따라 다르다. 메모리 상의 I/O는
필요한 반면, 디스크 상의 I/O는 가급적 많이 발생하지 않도록 하는 것이
중요하다. 디스크의 I/O 경합을 피하게 하기 위해서는, 파일이 여러
디바이스에 걸쳐 분산되도록 배치할 필요가 있다. 일부 백그라운드 프로세스
는 I/O 작업을 많이 일으키는데, 그와 같은 프로세스에는 DBWn, LGWn, ARCn,
CKPT 프로세스가 있다. 일부 상황에서는 DBA가 여러 개의 DBWn/ARCn 을
구동시키거나, 또는 DBWR/ARC0/LGWR I/O slave를 두는 것이 유리한지
여부를 판단할 필요가 있다.


3. 서버 레벨의 성능 점검

V$로 시작하는 dynamic performance view는, 자원 활용에 대한 통계
정보를 시스템 레벨과, 세션 레벨로 누적 시킨 결과를 보여준다. STATSPACK
과, Utlbstat/Utlestat 리포트는, 일정 주기동안 이와 같은 v$ view 값의
차이를 보여주는 역할을 하며, tkprof 유틸리티는 query 별 통계정보를
보여준다. tkprof을 사용하여 각 query에 대한 통계 정보를 조사하기
위해서는, Init<SID>.ora 파일에 TIMED_STATICS 값이 TRUE로 지정되어
있어야 한다.

각종 v$ view에 대한 설명은 Oracle 7/8/8i Server Referenece Manual에
자세히 기술되어 있다.

STATSPACK 또는 utlbstat/utlestat 리포트를 분석하는 방법에
대해서는, 각각 <Bulletin No: 10441 , 17118 >에 자세히 기술되어 있다.

Tkprof 결과를 해석하는 방법에 대해서는, <Bulletin No: 10134>에 자세히
기술되어 있다.


--------

다음 예는, 오라클에 가용한 다양한 툴을 이용해 얻은 결과의 예를
보여주고 있다.

1) STATSPACK 과 bstat/estat 리포트

Statistic Total Per Transact Per Logon Per Second
---------------------------- ------------- ---------------------- ----------------- ------------------
CPU used by this session 2278466 222.59 1974.41 203.6
CPU used when call started 2239857 218.82 1940.95 200.15
CR blocks created 2938 .29 2.55 .26
session pga memory 7138227 34521 991 191
session pga memory max 40327524 745091 98305 756
session uga memory 326143 96312 57843 654
session uga memory max 2483564 185735 12386 700




2) tkprof .prf 결과 파일

OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS

call count cpu elapsed disk query current rows
------------ --------- --------- ------------ ---------- ----------- ------------ ----------
Parse 3 0.04 0.05 0 0 0 0
Execute 4 0.00 0.05 0 0 0 0
Fetch 2 0.00 0.06 2 17 68 1
------------ --------- --------- ------------ ---------- ----------- ------------ ----------
total 9 0.04 0.16 2 17 68 1


3) 스크립트 실행 결과


REM Monitor memory usage
SQL> select sid, name, value
2 from v$statname n, v$sesstat s
3 where n.statistic# = s.statistic#
4 and n.name like '%memory%'
5 order by sid;

SID NAME VALUE
--------- --------------------------------- ----------
1 session uga memory 18252
1 session uga memory max 18252
1 session pga memory max 59568
1 sorts (memory) 0
1 session pga memory 59568
. .

REM monitor CPU usage
SQL> select sid, name, value
2 from v$statname n, v$sesstat s
3 where n.statistic# = s.statistic#
4 and n.name like '%cpu%'
5 order by sid;

SID NAME VALUE
--------- ------------------------------ ----------
1 recursive cpu usage 0
1 parse time cpu 0
1 OS Wait-cpu (latency) time 0
. .

REM monitor I/O
SQL> select file#, phyrds, phywrts
2 from v$filestat;

FILE# PHYRDS PHYWRTS
------------ -------------- ----------------
1 3239 141
2 80 246
3 9 163
4 6 3
5 5 3
. .


4. O/S 레벨의 성능 점검

1) OS Semaphore

각각의 오라클 인스턴스는 일정 갯수 만큼의 semaphore가 필요하다. 필요한
semaphore의 전체 갯수는, init.ora 파일의 'processes' 파라미터로부터
유도된다. 시스템에 인스턴스 또는 데이터베이스의 갯수를 추가시킬 때마다
O/S 커널 파라미터의 SEMMNS 값이 적절하게 변경되어야 한다.

2) Ulimits

기본적으로 설정하여야 할 커널 파라미터는 설치 가이드에 기술되어 있다.
유닉스 시스템에서 인스턴스나 데이터베이스 갯수를 늘리기 위해서는,
커널 파라미터 값을 적절하게 변경해 주어야 한다.

유닉스 환경에서 오라클 계정의 limit을 확인하기 위해서는 다음과 같이
한다.

% ulimit -Sa

(다음은 결과 예제이다)

time(seconds) unlimited
file(blocks) unlimited
data(kbytes) unlimited
stack(kbytes) unlimited
memory(kbytes) unlimited
coredump(blocks) 2097151
nofiles(descriptors) unlimited


5. 성능 점검에 필요한 툴

성능 점검을 위해 흔히 사용되어지는 툴에는 vmstat, iostat, pstat, size,
ipcs, ps, sar, 그리고 O/S 별로 제공되는 툴이 있다. 각각의 툴에 대한
플랫폼 별 설명은 매뉴얼 페이지를 참조하여야 한다.

다음은 유닉스에서 제공하는 툴을 이용하여 O/S 상태를 점검하는 예이다.

1) 메모리: 메모리 이용 상태를 보기 위해서는 vmstat (virtual memory statistics)
을 사용하며, 이 툴에서는 기본적으로 CPU와 메모리 상황을 보여준다.

OS 명령어
~~~~~~~~~~ ~~~~~~~~~
Sun Solaris: vmstat
HP: vmstat -n
IBM: /bin/vmstat
Compaq: /sbin/hwmgr
Linux: xosview

플랫폼 별로 제공되는 툴과 관련하여 참조 가능한 문서는 다음과 같다.

HPUX GLANCE: <Note:166490.1>

AIX SVMON: <Note:166491.1>

SUN SOLARIS PMAP: <Note:163763.1>


2) I/O: I/O와 관려된 상황은 "sar -d" 또는 "iostat" 등의 툴을 사용하여
정기적으로 점검해 볼 필요가 있다. 평균 서비스 시간이 50ms 이하가 계속
해서 유지되는 상황은 점검 대상이 된다. 이 경우, 디스크 간 부하를 조정
하여 분산시킬 필요가 있다.

디스크 공간 사용과 관련해서는, 다음과 같은 명령을 실행시켜
점검 해 볼 수 있다 : df -k
ORACLE_HOME의 위치와 데이터파일이 존재하는 디스크에 대해 충분한
공간이 있는지를 살펴보아야 한다. 일반적으로, mount 시킨 디스크 별로
90% 이상의 공간을 사용하지 않도록 유지시켜야 한다.


3) CPU:

OS 명령어
~~~~~~~~~~ ~~~~~~~~~
Sun Solaris: sar -u
IBM: ps av (또는) iostat 3 20
Digital: /usr/sbin/pset_info
Linux: xosview

CPU 활용율을 모니터 하는 것 이외에도, 프로세스가 가용한
프로세서에서 실행 가능할 때까지 대기하는지 여부를 살펴보기 위해
runqueue의 길이도 살펴볼 필요가 있다. runqueue의 길이는 "sar -q"
명령을 실행시켜 알 수 있다.


4) CPU가 여러 개인 장비에서, 프로세서별 CPU time을 알아 보기 위해서는
다음과 같은 명령을 수행시킨다.

OS 명령어
~~~~~~~~~~ ~~~~~~~~~
Sun Solaris: /usr/bin/mpstat
HP: /usr/sbin/sar -M 5 5
IBM: vmstat -> cpu 항목에 나와있다. 만약 "us" 값이 매
우 클 경우, 시스템에 CPU intensive한 프로세스가
존재하는 것을 의미한다.

5) 시스템에 설치된 CPU와 각각의 상태를 조사하기 위해서는 다음과
같은 명령을 수행시킨다.

OS 명령어
~~~~~~~~~~ ~~~~~~~~~
Sun Solaris: /usr/sbin/mpstat
HP: /usr/sbin/sar -M 2 2
IBM: /usr/sbin/bindprocessor -q
Digital: /usr/sbin/psrinfo -v
Linux: xosview


6) 시스템의 swap 공간 및 활용 상태를 조사하기 위해서는 다음과
같은 명령을 수행시킨다.

OS 명령어
~~~~~~~~~~ ~~~~~~~~~
Sun Solaris: /etc/swap -l and /etc/swap -s
HP: /etc/swapinfo -m (root 계정에서 실행해야만 함)
IBM: lsps -a
Digital: /usr/sbin/swapon -s
Linux: free -t


7) shaerd memory 및 semaphore와 관련된 정보를 얻기 위해서는 다음과
같은 명령을 수행시킨다.

"ipcs -b"



Example
-------


Reference Documents
-------------------
<Note:148466.1>