본문 바로가기
OraclE

Windows 32bit OS 에서 Oracle Memory Sizing

by 타마마임팩트_쫀 2008. 8. 13.
제품 : Database

작성날짜 : 2007-12-21

PURPOSE
-------

Windows 32bit OS 메모리 제약과 Oracle 에서 추가메모리 사용하도록 설정하는 방법을 설명한다.


CONTENTS
--------

1. Windows 32bit 메모리 확장 관련 용어들
2. Windows 32bit 메모리 확장 설정 방법
3. AWE_WINDOW_MEMORY 파라미터 산정
4. Windows 에서 Oracle 메모리 사용량 모니터링
5. Windows 에서 Oracle 메모리 사용량 줄이는 방법

EXPLANATIONS
------------

1. Windows 32bit 메모리 확장 관련 용어

- /3GB
Windows 32bit OS 에서 메모리 어드레싱은 4GB 까지 가능하고, 이 중 2GB 는 커널이 사용하고
나머지 2GB 가 사용자 프로세스에게 할당되는 최대 메모리 크기이다. Windows 2000 이상에서는
/3GB 옵션을 사용하여 커널에 1GB 만 할당하고 나머지 3GB 를 사용자 프로세스에게 할당하여
2GB 한계를 넘어 메모리를 확장하여 사용할 수 있다. OS 에서는 boot.ini에 /3GB 옵션 추가하고,
어플리케이션 실행파일 헤더에 IMAGE_FILE_LARGE_ADDRESS_AWARE bit 이 설정되어 있으면 된다.
Oracle 8.1.7 이상에서는 기본적으로 IMAGE_FILE_LARGE_ADDRESS_AWARE bit 설정되었으므로 3GB
사용가능하다. 참고로 Windows 64bit OS 는 한 프로세스당 어드레싱 가능한 메모리가 8TB 이므로
32bit 에서 사용하는 추가적인 옵션들이 필요없다.

- /PAE (Physical Address Extentions)
/3GB 옵션과 더불어 32bit 메모리 제약을 넘기위한 방법으로, 가상 메모리내에 포인터 테이블로
"별도 메모리 영역"을 매개함으로 프로세스가 사용할 수 있는 실제 메모리 크기를 확장한다.
예를들어 Oracle 은 가상 메모리 2GB 영역 (/3GB 사용하면 3GB) 내에 포인터 테이블(window)만
저장하고 실제 DB BUFFER CACHE 는 "별도 메모리 영역" 에 할당한 후, BUFFER CACHE 사용시
포인터 테이블을 매개하여 실제 BUFFER CACHE 영역 사용한다. 여기서 "별도 메모리 영역" 도
메모리를 사용하는 것이다.

- AWE (Address Windowing Extensions) & Oracle 구현방식
AWE 는 PAE 기능을 사용하도록 어플리케이션에 제공된 API 이다.
AWE API 를 사용한 오라클 버젼들은 아래와 같다.
* Oracle 8.1.6.x
* Oracle 8.1.7.x
* Oracle 9.2.x
* Oracle 10.1.x
* Oracle 10.2.x

주의! 9.1.0.x 는 AWE 지원안됨.

AWE 구현된 Oracle 버젼들은 3GB 이상의 SGA 사용할 수 있는데, 정확히 말하면 SGA 중 BUFFER CACHE
영역만 3GB 이상의 "별도 메모리 영역"에 지정할 수 있다. 오라클에서 AWE 를 사용하면 BUFFER CACHE
사용시 포인터 테이블과 실제 BUFFER CACHE 가 있는 별도 메모리 영역과의 mapping & unmapping
과정이 추가되므로 기본적인 처리보다 느릴 수 있지만, 적어도 IO 을 줄일 수 있기 때문에
IO 느린 시스템에서는 성능 향상을 기대할 수 있다.


2. Windows 32bit 메모리 확장 설정 방법

- boot.ini 에 /3GB /PAE option 을 추가
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Advanced Server" /3GB /PAE

- 오라클 서비스 실행하는 OS USER 에 "Lock memory pages"의 권한 부여
. Start -> Programs -> Administrative Tools -> Local Security Policy
(on a Domain Controller, click on 'Domain Security Policy' instead of 'Local Security Policy')
. Double-click on the 'Lock Pages in memory' policy.
. Add the appropriate user and click 'Ok'.
. Restart the OracleService<SID>

- 포인터 테이블 (window) 크기 지정하는 AWE_WINDOW_MEMORY 를 레지스트리 추가
. HKEY_LOCAL_MACHINE => Software => Oracle => HomeX 에 AWE_WINDOW_MEMORY=1024000000 추가
주의! 여러 인스턴스라면 각 Home 에 추가

- init.ora 에 USE_INDIRECT_DATA_BUFFERS=TRUE 추가하고 DB_BLOCK_BUFFERS 로 BUFFER CACHE 크기 설정

주의! DB_CACHE_SIZE 로 BUFFER CACHE 지정하면 에러 발생한다.
ORA-00385: cannot enable Very Large Memory with new buffer cache parameters

- Oracle10g 에서는 SGA_TARGET=0 설정하여 Automatic Memory Management 를 disable 해야한다.


3. AWE_WINDOW_MEMORY 크기 계산 방법

(1) 기본값 : AWE_WINDOW_MEMORY = 1GB

/PAE /3GB 를 지정해도 아래 메모리들의 총합은 3GB 내에 들어와야한다.
- AWE_WINDOW_MEMORY
- BUFFER CACHE 제외한 SGA (shared_pool, large_pool, java_pool, log_buffers ...)
- Overhead for Oracle.exe DLLs (100MB 정도)
- Stack space per thread (1MB/thread)
- PGA and UGA

결국 BUFFER CACHE 최대 크기는 OS 메모리 - 4GB + AWE_WINDOW_MEMORY 로 산정된다.
(여기서 4GB는 Oracle이 사용하는 3GB와 OS에서 사용하는 1GB의 합. 결국 이 영역을 제외한 나머지 영역에 buffer cache를 지정하여 사용할 수 있다.)
예를들어 12GB RAM 시스템에서 최대 BUFFER CACHE 크기= (Total RAM - 4GB + AWE_WINDOW_MEMORY) = 12GB - 4GB + 1GB = 9GB 이다.

(2) 8.1.7 이하에서는 AWE_WINDOW_MEMORY 최소값 제한이 없었으나,
Oracle9i R2 부터 최소값보다 작게 설정하면 DB 기동시 에러들이 발생한다.

ORA-27102 out of memory
OSD-00034 Message 34 not found; Product=RDBMS;facility =SOSD
O/S Error: (OS 8) Not enough storage is available to process this command


AWE_WINDOW_MEMORY 최소값 계산 공식
----------------------------------
a. MIN(AWE_WINDOW_MEMORY)= (4096 * DB_BLOCK_SIZE * _DB_BLOCK_LRU_LATCHES)/8
b. _DB_BLOCK_LRU_LATCHES = (Max buffer pools * SETS_PER_POOL)
c. Max Buffer Pools = 8 (상수)
d. SETS_PER_POOL /* USE_INDIRECT_DATA_BUFFERS=TRUE 로 VLM ENABLED */
SETS_PER_POOL = 2*CPU_COUNT (if VLM is enabled)
SETS_PER_POOL = CPU Count/2 (if VLM is NOT enabled)

시나리오 #1:
----------------
# of CPU's = 8
DB_BLOCK_SIZE = 8192
Total RAM = 8GB

SETS_PER_POOL = 2 * CPU_COUNT = 16
_DB_BLOCK_LRU_LATCHES = (max buffer Pools * sets_per_pool) = 8*16 = 128
MIN(AWE_WINDOW_MEMORY) = (4096*DB_BLOCK_SIZE * _DB_BLOCK_LRU_LATCHES) / 8
= (4096 * 8192 * 128) / 8 = 536870912 bytes = 512 MB


시나리오 #2:
---------------
# of CPU's = 16
DB_BLOCK_SIZE = 8192
Total RAM = 16 GB

SETS_PER_POOL = 2 * CPU_COUNT = 32
_DB_BLOCK_LRU_LATCHES = (max buffer Pools * sets_per_pool) = 8*32 = 256
MIN(AWE_WINDOW_MEMORY) = (4096*DB_BLOCK_SIZE * _DB_BLOCK_LRU_LATCHES) / 8
= ( 4096 * 8192 * 256) / 8 = 1073741824 bytes = 1024 MB

주의 !!!
1. ORA-27102 는 AWE_WINDOW_MEMORY 최소값 이하일때도 발생하지만, BUFFER CACHE 가
실제 메모리보다 크게 지정된 경우에도 발생한다.
2. ORA-27102 는 DB_BLOCK_BUFFER < AWE_WINDOW_MEMORY 일때도 발생한다.
3. AWE_WINDOW_MEMORY 설정값은 "계산된 최소값 + 10 MB (overhead)" 으로 설정해야한다.
4. Hyperthreading enabled 시스템의 경우 # of CPU's 를 두배로 계산해야한다.

4. Windows 에서 Oracle 메모리 사용량 모니터링
TASK MANAGER 에서 VM 값은 정확하지 않으므로 관리도구에서 별도 모니터링해야한다.
관리도구 => Perfomance 선택 => "추가" => 성능개체:Process, Count:Virtual Bytes, Instance:oracle.exe 선택


5. Windows 에서 Oracle 메모리 사용량 줄이는 방법

(1) Oracle 실행파일 스택 크기 조정
Thread 들이 미리 1MB 스택을 PGA 로 선점하고 필요하게 되면 더 확장해서 사용하는데
대부분들의 Thread 들은 초기 스택도 사용하지 않는 경우가 많다.
아래처럼 default=1 MB 를 500 KB로 줄일 수 있다.

. DB 내린 후 ORACLE_HOME/bin 에서 수행
C:\OH\bin> orastack oracle.exe 500000
C:\OH\bin> orastack tnslsnr.exe 500000
C:\OH\bin> orastack svrmgrl.exe 500000

(2) Shared Server (pre-Oracle9i 는 MTS 설정) 사용: 세션들이 메모리를 공유하므로 Oracle 프로세스 전체적인 메모리를 줄일 수 있다.


References
----------
Note 225349.1 - Implementing Address Windowing Extensions (AWE) or VLM on Windows Platforms
Note.205089.1 - Oracle and Hyperthreading

'OraclE' 카테고리의 다른 글

ASSM에서 Freelist 관리  (0) 2008.09.25
DBA Table / View 정리  (0) 2008.09.17
오라클에서 시퀀스(SEQUENCE) 사용하기  (0) 2008.09.17
BITMAPPED INDEX  (0) 2008.08.12
REVERSE KEY INDEX  (0) 2008.08.12