Oracle 데이터베이스가 디스크에서 데이터를 읽거나 쓸 때마다 디스크 입출력(I/O) 작업이 발생합니다. 많은 소프트웨어 애플리케이션의 성능은 디스크 I/O에 의해 제한되며, 대부분의 CPU 시간을 I/O 작업 완료를 기다리는 데 소모하는 애플리케이션을 'I/O 바운드(I/O bound)' 상태라고 합니다. I/O 교정(I/O Calibration)은 바로 이러한 문제를 해결하는 데 도움을 주는 기능입니다.
개요
안정적인 I/O 서브시스템을 구축하는 것은 애플리케이션 인프라를 구성하는 데 필수적인 요소입니다. I/O 스택에서 어떤 구성 요소든 처리량(throughput)이 제한되면 그 부분이 I/O 흐름 전체의 최약 고리가 됩니다. 실제 운영 환경의 워크로드를 손쉽게 재현하기 어렵기 때문에, I/O 서브시스템 검증은 늘 어려운 과제로 여겨져 왔습니다.
Oracle Database의 I/O 교정 기능을 사용하면 스토리지 서브시스템의 성능을 평가하고, I/O 성능 문제가 데이터베이스 때문인지 아니면 스토리지 서브시스템 때문인지 판별할 수 있습니다. I/O 작업을 순차적으로 수행하는 다른 외부 I/O 교정 도구와 달리, Oracle Database의 I/O 교정 기능은 Oracle 데이터 파일을 사용해 스토리지 미디어에 무작위(random) 방식으로 I/O 작업을 수행합니다. 이를 통해 데이터베이스의 실제 성능과 더욱 유사한 결과를 얻을 수 있습니다.
Calibrate I/O 기능은 DBMS_RESOURCE_MANAGER.CALIBRATE_IO()라는 PL/SQL 함수를 기반으로 동작합니다. Calibrate I/O가 호출되면 다음과 같은 특징을 가진 워크로드를 생성합니다.
- I/O 집약적이며 읽기 전용인 무작위(random) I/O (db_block_size)
- 대용량 블록(1MB) 순차 I/O 워크로드
Calibrate I/O의 결과는 지속적으로 모니터링하면서 예상 처리량(I/O 서브시스템의 최대 전체 처리량)과 비교해야 합니다. I/O 교정은 스토리지 서브시스템의 성능을 평가하고, I/O 성능 문제가 데이터베이스 호스트에서 비롯된 것인지 스토리지 서브시스템에서 비롯된 것인지 판단하는 데 활용할 수 있습니다.
이 글에서는 다음 내용을 다룹니다.
- I/O 교정 사전 요구 사항
- I/O 교정 실행 방법
- 교정 시 고려 사항
I/O 교정 사전 요구 사항
I/O 교정을 실행하기 전에 다음 요구 사항이 충족되었는지 확인해야 합니다.
- 사용자에게
SYSDBA권한이 부여되어 있어야 합니다. TIMED_STATISTICS파라미터가TRUE로 설정되어 있어야 합니다.- 비동기 I/O(Asynchronous I/O)가 활성화되어 있어야 합니다.
파일 시스템을 사용하는 경우, FILESYSTEMIO_OPTIONS 초기화 파라미터를 SETALL로 설정하면 비동기 I/O를 활성화할 수 있습니다.
동기(synchronous) I/O 방식에서는 운영체제에 I/O 요청이 제출되면 해당 작업이 완료될 때까지 쓰기 프로세스가 차단(blocking)됩니다. 반면 비동기(asynchronous) I/O 방식에서는 호출 프로세스가 자신의 작업을 계속 수행하며, 아직 실행 중인 다른 요청들을 차단하지 않습니다.
다음 SQL 쿼리를 실행하여 데이터 파일에 대해 비동기 I/O가 활성화되어 있는지 확인하세요.
COL NAME FORMAT A50
SELECT NAME,ASYNCH_IO FROM V$DATAFILE F,V$IOSTAT_FILE I
WHERE F.FILE#=I.FILE_NO
AND FILETYPE_NAME='Data File';
아래 이미지는 위 쿼리와 그 결과를 보여줍니다.
셀 명령 결과 목록
참고: 한 데이터베이스 인스턴스에서는 한 번에 하나의 교정만 수행할 수 있습니다.
I/O 교정 실행 방법
Oracle Database의 I/O 교정 기능은 DBMS_RESOURCE_MANAGER.CALIBRATE_IO 프로시저를 통해 사용할 수 있습니다. 이 프로시저는 데이터베이스 파일에 I/O 집약적인 읽기 전용 워크로드(1MB 크기의 무작위 I/O 연산으로 구성)를 발생시켜, 스토리지 서브시스템이 감당할 수 있는 최대 IOPS(초당 I/O 요청 수)와 MBPS(초당 메가바이트 I/O)를 측정합니다.
DBMS_RESOURCE_MANAGER.CALIBRATE_IO 프로시저를 이용한 I/O 교정은 다음 두 단계로 진행됩니다.
-
데이터베이스 블록 크기 읽기 테스트: 프로시저가 모든 데이터베이스 인스턴스에서 모든 데이터 파일에 대해 무작위 데이터베이스 블록 크기(기본값 8KB) 읽기를 수행합니다. 이 단계는 데이터베이스가 감당할 수 있는 초당 최대 I/O 연산 수(IOPS)를 출력 파라미터
max_iops로 반환합니다.max_iops값은 온라인 트랜잭션 처리(OLTP) 데이터베이스에서 중요한 지표입니다. 출력 파라미터actual_latency는 해당 워크로드의 평균 지연 시간(latency)을 제공하며, 입력 파라미터max_latency를 통해 원하는 목표 지연 시간을 밀리초 단위로 지정할 수 있습니다. 이는 데이터베이스 블록 크기 I/O 요청에 허용 가능한 최대 지연 시간을 의미합니다. -
대용량 블록(1MB) 읽기 테스트: 프로시저가 모든 데이터베이스 인스턴스에서 모든 데이터 파일에 대해 무작위 1MB 읽기를 수행합니다. 이 단계는 데이터베이스가 감당할 수 있는 초당 최대 메가바이트(MBPS)를 나타내는 출력 파라미터
max_mbps를 반환합니다. 이 지표는 데이터 웨어하우스 환경에서 특히 중요합니다.
사용자가 num_physical_disks 입력 파라미터(데이터베이스 스토리지 시스템의 대략적인 물리적 디스크 수)를 제공하면 교정이 더욱 효율적으로 실행됩니다.
I/O 워크로드 실행으로 인한 오버헤드가 존재하기 때문에, I/O 교정은 일반 데이터베이스 워크로드에 미치는 영향을 최소화하기 위해 데이터베이스가 유휴(idle) 상태일 때나 피크 시간대가 아닌 시간에만 수행해야 합니다.
아래 이미지는 DBMS_RESOURCE_MANAGER.CALIBRATE_IO 프로시저의 출력 결과를 보여줍니다.
셀 명령 결과 목록
교정 시 고려 사항
I/O 교정을 실행하기 전에 다음 사항을 반드시 고려해야 합니다.
- 동일한 스토리지 서브시스템을 사용하는 데이터베이스에서는 한 번에 하나의 교정만 실행해야 합니다. 동일한 스토리지 서브시스템을 공유하는 별개의 데이터베이스에서 동시에 교정을 실행하면 교정이 실패합니다.
- 인스턴스의 I/O를 최소화하기 위해 데이터베이스를 정지(quiesce) 상태로 만드는 것이 좋습니다.
- Oracle RAC(Real Application Clusters) 구성에서는 노드 간 스토리지 서브시스템 전체를 교정하기 위해 모든 인스턴스가 오픈(open) 상태여야 합니다.
- Oracle RAC 데이터베이스의 경우, 워크로드가 모든 인스턴스에서 동시에 생성됩니다.
num_physical_disks입력 파라미터는 선택 사항입니다. 이 파라미터를 데이터베이스 스토리지 시스템의 대략적인 물리적 디스크 수로 설정하면 교정 속도가 빨라지고 결과도 더 정확해집니다.
I/O 교정 프로세스가 진행되는 동안 언제든지 V$IO_CALIBRATION_STATUS 뷰에서 교정 상태를 조회할 수 있습니다. I/O 교정이 성공적으로 완료되면 DBA_RSRC_IO_CALIBRATE 테이블에서 결과를 확인할 수 있습니다. 예시는 다음과 같습니다.
| 컬럼명 | 값 |
|---|---|
| START_TIME | 31-AUG-17 04.40.09.920679 AM |
| END_TIME | 31-AUG-17 04.47.41.210939 AM |
| MAX_IOPS | 39 |
| MAX_MBPS | 60 |
| MAX_PMBPS | 69 |
| LATENCY | 24 |
| NUM_PHYSICAL_DISKS | 1 |
결론
I/O 리소스 관리(IORM)와 Calibrate I/O 기능은 현재 I/O 아키텍처의 한계를 파악하는 데 매우 유용한 도구입니다. 교정이 완료된 후에는 측정된 정보를 활용하여 적절한 I/O 설계 및 용량 산정(sizing) 작업을 수행할 수 있습니다. 의견이나 질문이 있다면 피드백 탭을 통해 남겨 주세요.