본문 바로가기
IT/AWR-ASH

디스크 I/O 대기 분석: 디스크 읽기/쓰기 지연이 성능 저하에 미치는 영향 분석

by free-inf 2025. 2. 9.

서버 이관 프로젝트를 수행하는 과정에서 가장 중요한 과제 중 하나는 데이터베이스 성능을 안정적으로 유지하는 것이다. 새로운 서버 환경에서는 기존 환경과 다른 성능 특성이 나타날 수 있으며, 특히 디스크 I/O 성능 저하는 데이터베이스의 전반적인 성능에 큰 영향을 미칠 수 있다.

 

디스크 I/O 대기(Time Spent on I/O)는 SQL이 데이터를 읽거나 쓸 때 디스크에서 응답을 받기까지 기다리는 시간을 의미한다. 이 값이 높아질수록 SQL 실행 시간이 길어지고, 데이터베이스의 응답 속도가 저하되면서 전체 시스템 성능이 저하될 수 있다.

 

본 글에서는 디스크 I/O 대기가 발생하는 원인과 성능 저하에 미치는 영향, 그리고 이를 분석하고 최적화하는 방법을 설명한다. 이를 통해 서버 이관 후 발생할 수 있는 I/O 병목을 신속하게 파악하고 해결할 수 있도록 한다.


1. 디스크 I/O 대기란?

1.1 디스크 I/O 대기의 개념

디스크 I/O 대기는 SQL이 실행되는 동안 데이터 블록을 읽거나 쓰는 과정에서 발생하는 지연 시간을 의미한다. 데이터베이스는 메모리에 캐시된 데이터를 우선적으로 활용하지만, 필요한 데이터가 메모리에 존재하지 않을 경우 디스크에서 데이터를 읽어와야 한다.

디스크 I/O는 CPU보다 속도가 느리기 때문에 디스크 I/O 요청이 많아질수록 데이터베이스의 응답 속도가 느려질 가능성이 크다. 따라서 I/O 대기 시간이 길어지는 경우, 데이터베이스 성능 저하의 주요 원인으로 작용할 수 있다.


1.2 디스크 I/O 대기가 성능 저하에 미치는 영향

디스크 I/O 성능 저하는 다음과 같은 문제를 초래할 수 있다.

  1. SQL 실행 속도 저하
    • 데이터 읽기/쓰기 속도가 느려지면서 전체적인 응답 시간이 증가.
    • Full Table Scan이 많아질 경우, 디스크 부하가 급증.
  2. 트랜잭션 처리 지연
    • 트랜잭션이 완료되지 않고 대기 상태로 유지될 가능성이 증가.
    • 특히 다중 사용자가 동시 처리하는 OLTP 시스템에서 성능 저하가 두드러짐.
  3. 서버 리소스 과부하
    • I/O가 지연되면서 CPU 사용량도 함께 증가하는 경우 발생.
    • 다량의 I/O 요청이 병목을 유발하여 시스템 전체 성능 저하.
  4. 대기 이벤트 증가
    • "db file sequential read", "db file scattered read" 등의 대기 이벤트가 증가.
    • SQL 실행이 디스크 I/O로 인해 지연됨에 따라, 세션 간 충돌이 증가할 수 있음.

2. 디스크 I/O 대기 분석 방법

디스크 I/O 대기 시간을 분석하려면 ASH(Active Session History) 데이터와 AWR(Automatic Workload Repository) 보고서를 활용하는 것이 효과적이다.

2.1 ASH를 활용한 디스크 I/O 대기 이벤트 분석

아래 SQL을 실행하면 디스크 I/O 관련 대기 이벤트가 가장 많이 발생한 목록을 확인할 수 있다.

 
SELECT event, COUNT(*) AS wait_count
FROM v$active_session_history
WHERE wait_class = 'User I/O'
AND sample_time BETWEEN TO_DATE('2024-02-07 10:00:00', 'YYYY-MM-DD HH24:MI:SS')
AND TO_DATE('2024-02-07 10:30:00', 'YYYY-MM-DD HH24:MI:SS')
GROUP BY event ORDER BY wait_count DESC;
  • wait_class = 'User I/O': 디스크 I/O 관련 대기 이벤트만 필터링.
  • COUNT(*) AS wait_count: 가장 빈번하게 발생한 이벤트를 확인.

이 데이터를 활용하면, 디스크 I/O로 인해 SQL 실행이 지연되는 주요 원인을 파악할 수 있다.


2.2 AWR 보고서를 활용한 I/O 성능 분석

AWR 보고서를 활용하면 디스크 I/O 성능 지표를 분석하고 SQL별 I/O 사용량을 비교할 수 있다.

AWR 보고서를 생성하려면 다음 명령을 실행한다.

 
@$ORACLE_HOME/rdbms/admin/awrrpt.sql

실행 후 보고서 유형(HTML 또는 TEXT), 분석할 시간 범위 등을 설정하면 AWR 보고서가 생성된다.

AWR 보고서에서 다음 항목을 분석하여 디스크 I/O 병목 여부를 확인할 수 있다.

  • Top SQL by Physical Reads: 디스크에서 가장 많은 데이터를 읽은 SQL.
  • Top SQL by Physical Writes: 디스크에 가장 많은 데이터를 기록한 SQL.
  • Wait Event Statistics (User I/O): 디스크 I/O 대기 이벤트의 전체 통계.

이 데이터를 활용하면, 디스크 I/O 부하를 발생시키는 SQL을 우선적으로 최적화할 수 있다.


3. 디스크 I/O 성능 최적화 방법

디스크 I/O 성능을 최적화하기 위해 다음과 같은 기법을 적용할 수 있다.

3.1 인덱스를 활용한 Full Table Scan 방지

디스크 I/O가 많은 SQL의 경우 Full Table Scan이 발생할 가능성이 높다. 이를 해결하려면 적절한 인덱스를 활용해야 한다.

-- Full Table Scan이 발생하는 SQL
SELECT * FROM employees WHERE department = 'Sales';
 
-- 인덱스 생성
CREATE INDEX emp_dept_idx ON employees(department);
 
-- 최적화된 SQL (Index Scan 활용)
SELECT * FROM employees WHERE department = 'Sales';
  • 결과: Full Table Scan 대신 Index Scan을 활용하여 디스크 I/O 부담을 감소.

3.2 테이블 파티셔닝을 활용한 I/O 부하 분산

대량의 데이터가 포함된 테이블에서 특정 범위의 데이터를 자주 조회하는 경우, 테이블을 파티셔닝하면 성능이 개선될 수 있다.

-- 월별 데이터를 기준으로 테이블 파티셔닝
CREATE TABLE sales ( sale_id NUMBER, sale_date DATE, amount NUMBER )
PARTITION BY RANGE
           (sale_date) ( PARTITION p202401 VALUES LESS THAN (TO_DATE('2024-02-01', 'YYYY-MM-DD')), PARTITION p202402 VALUES LESS THAN (TO_DATE('2024-03-01', 'YYYY-MM-DD')) );
  • 결과: 특정 범위의 데이터만 조회하도록 하여 디스크 I/O를 줄이고 성능을 개선.

3.3 Direct Path Read/Write 튜닝

대량 데이터를 처리하는 SQL에서는 Direct Path Read를 활용하면 I/O 성능을 개선할 수 있다.

-- Direct Path Read 활용
ALTER SESSION SET "_serial_direct_read" = TRUE;
  • 결과: 버퍼 캐시를 거치지 않고 데이터를 직접 읽어와 I/O 대기 시간을 감소.

 

디스크 I/O 대기 이벤트는 SQL 실행이 디스크에서 데이터를 읽거나 쓰는 동안 발생하는 성능 저하 원인이다. 이러한 문제가 지속되면 트랜잭션 지연, 서버 부하 증가, 응답 속도 저하 등 여러 성능 이슈가 발생할 수 있다.

 

ASH와 AWR 보고서를 활용하여 디스크 I/O 부하를 분석하고, 인덱스 최적화, 테이블 파티셔닝, Direct Path Read 활용 등 다양한 성능 개선 기법을 적용하면 I/O 병목 문제를 효과적으로 해결할 수 있다.