Oracle

게시글 보기
작성자 유건데이타 등록일 2015-05-18
제목 Oracle 8에서의 DBWR (dbwr_io_slaves와 db_writer_processes)
Oracle 8에서의 DBWR (dbwr_io_slaves와 db_writer_processes)
----------------------------------------------------------------------

Oracle 7에서의 db_writers는 master-slave processing을 통해, async I/O를
simulate하기 위해 사용되었다고 볼 수 있다. Oracle 8에서 DBWR의 write
processing에 더 나은 성능을 제공하기 위해 복수 개의 database writer를 사용
하는 방법은 다음과 같이 두가지로 나눌 수 있다.

1. DBWR IO slaves (dbwr_io_slaves)

Oracle7에서의 mulitple DBWR process들은 단순히 slave process로서, asynch
I/O call을 수행할 수는 없었다. Oracle 8.0.3부터, slave database writer code
가 kernal에 포함되었고, slave process의 async I/O가 가능하게 되었다. 이것은
init.ora file 내에 dbwr_io_slaves라는 parameter를 통해 가능하며, IO slave가
asynchronous I/O가 가능하여 I/O call 이후에 slave가 block되지 않아 더 나은
성능을 제공한다는 것을 제외하고는 Oracle7과 매우 유사하다. slave process는
instance 생성 시기가 아닌 database open 시에 start되기 때문에 oracle process
id가 9번부터 할당되며, o/s에서 확인되는 process 이름도 ora_i10n_SID와 같은
형태가 된다.
dbwr_io_slaves=3으로 지정한 경우, 아래와 같은 oracle background process가
구동되며, ora_i101_V804, ora_i102_V804, ora_i103_V804이 dbwr의 slave
process들이다.

tcsol2% ps -ef | grep V804
usupport 5419 1 0 06:23:53 ? 0:00 ora_pmon_V804
usupport 5429 1 1 06:23:53 ? 0:00 ora_smon_V804
usupport 5421 1 0 06:23:53 ? 0:00 ora_dbw0_V804
usupport 5433 1 0 06:23:56 ? 0:00 ora_i101_V804
usupport 5423 1 0 06:23:53 ? 0:00 ora_arch_V804
usupport 5431 1 0 06:23:53 ? 0:00 ora_reco_V804
usupport 5435 1 0 06:23:56 ? 0:00 ora_i102_V804
usupport 5437 1 0 06:23:56 ? 0:00 ora_i103_V804
usupport 5425 1 0 06:23:53 ? 0:00 ora_lgwr_V804
usupport 5427 1 0 06:23:53 ? 0:00 ora_ckpt_V804


2. Multiple DBWR (db_writer_processes)

multiple database writer는 init.ora file내의 db_writer_processes라는
parameter에 의해 구현되며, 이것은 Oracle 8.0.4부터 제공되었다. 이것은
기존의 master-slave 관계가 아닌 진정한 의미의 복수개의 database writer를
사용하는 것이며, database writer process들은 PMON이 start된 후에 start되어
진다.
이름은 ora_dbwn_SID 형태이며, 아래에 db_block_lru_latches=2,
db_writer_processes=2로 지정한 경우 구동된 oracle background process들의
예이다. 여기에서 ora_dbw0_V804, dbw1_V804이 dbwr process들이다. 만약
db_writer_processes를 지정하지 않으면 기본값은 1인데 이 때도 Oracle7과 같이
ora_dbwr_SID 형태가 아닌 ora_dbw0_SID 형태의 process가 구동된다.

usupport 5522 1 0 06:31:39 ? 0:00 ora_dbw1_V804
usupport 5524 1 0 06:31:39 ? 0:00 ora_arch_V804
usupport 5532 1 0 06:31:39 ? 0:00 ora_reco_V804
usupport 5528 1 0 06:31:39 ? 0:00 ora_ckpt_V804
usupport 5530 1 0 06:31:39 ? 0:00 ora_smon_V804
usupport 5526 1 0 06:31:39 ? 0:00 ora_lgwr_V804
usupport 5520 1 0 06:31:39 ? 0:00 ora_dbw0_V804
usupport 5518 1 0 06:31:38 ? 0:00 ora_pmon_V804

db_writer_processes로 지정된 각 writer process는 하나의 latch set에 할당된다.
그러므로 db_writer_processes를 db_block_lru_latches으로 지정되는 LRU latch의
갯수와 같은 값으로 지정하는 것이 권장할 만하며, 단 CPU의 갯수를 초과하는 것은
바람직하지 않다.

[참고] 현재까지 init.ora file내에 구동되는 dbwr의 갯수는 db_block_lru_latches
parameter에 의해 제한된다. 즉 db_writer_processes 값을 db_block_lru_latches
보다 크게 하여도 db_block_lru_latches로 지정
된 수의 dbwr process가 기동된다.

Oracle8에서 DBWR I/O slave나 복수개의 DBWR를 제공하는 방법 중 좋은 점은
이 기법을 제공하는 것이 kernal 안에 포함되어 기존의 OSD layer로 구현되었던
것보다 port specific한 부분이 없고 generic하다는 것이다.


3. 두 가지 방법 중 선택 시 고려사항

이러한 두가지 형태의 DBWR 기법이 모두 도움이 되기는 하지만, 일반적으로
어느 것을 사용할 것인지는 OS level에서 asynchronous I/O가 제공하는지와
CPU 갯수에 의존한다. 즉, system이 복수 개의 CPU를 가지고 있으면
db_writer_processes를 사용하는 것이 바람직하며, aync I/O를 제공하는 경우
두 가지 모두 사용에 효과를 얻을 수 있다. 그런데 여기서 주의할 것은
dbwr_io_slaves가 약간의 overhead가 있다는 것이다.
slave IO process를 가능하게 하면, IO buffer와 request queue의 할당을 위해
부가적인 shared memory가 필요하다.
multiple writer processes와 IO slave는 매우 부하가 많은 OLTP 환경에서
적합하며, 일정 수준 이상의 성능을 요구할 때만 사용하도록 한다. 예를 들어
asynch I/O가 사용 가능한 경우, I/O slave도 사용하지 않고 하나의 DBWR만을
asynch I/O mode로 사용하는 것이 충분하고 바람직할 수 있다. 현재의 성능을
조사하고 bottleneck이 되는 부분이 DBWR 부분인지 정확히 조사한 후 사용하여야
한다.

[참고] 이 두 parameter를 함께 사용하면 dbwr_io_slaves만 효과가 있다.
이것은 dbwr_io_slaves는 master dbwr process를 db_writer_proceses에 관계 없이
하나만 가지도록 되어 있기 때문이다.
Comment
등록된 코멘트가 없습니다.