서버 이관 프로젝트에서 가장 중요한 부분 중 하나는 데이터베이스 성능을 안정적으로 유지하는 것이다. 기존 서버와 새로운 환경 간의 차이로 인해 예상치 못한 성능 저하가 발생할 수 있으며, 이러한 문제가 운영에 영향을 미치지 않도록 신속히 분석하고 대응하는 것이 필수적이다.
SQL이 실행될 때 속도가 느려지는 원인은 다양하지만, 그중에서도 대기 이벤트(Wait Event) 는 성능 저하의 주요 원인을 파악하는 핵심 요소다. Oracle 데이터베이스에서는 SQL 실행이 지연될 때, 해당 SQL이 어떤 이유로 대기하고 있는지 기록하는데, 이를 분석하면 CPU, 디스크 I/O, 메모리, 락(Lock) 등 다양한 요소 중 어디에서 병목이 발생하는지를 정확히 파악할 수 있다.
이 글에서는 대기 이벤트의 개념과 주요 유형, 대기 이벤트를 분석하는 방법, 그리고 성능 최적화를 위한 대응 전략을 설명한다. 이를 통해 서버 이관 후 발생할 수 있는 성능 문제를 효과적으로 진단하고 해결할 수 있도록 한다.
1. 대기 이벤트(Wait Event)란?
1.1 대기 이벤트의 개념
대기 이벤트란 SQL이 실행되는 동안 특정 자원을 기다리는 시간을 의미한다. 일반적으로 SQL이 실행될 때는 CPU를 사용하여 데이터를 처리하지만, 특정한 이유로 인해 실행이 즉시 완료되지 못하고 일정 시간 동안 대기해야 하는 경우가 발생한다.
이러한 대기 시간이 길어질수록 SQL 실행 속도가 느려지고, 전체적인 성능 저하로 이어질 수 있다. 따라서 대기 이벤트를 분석하는 것은 SQL 튜닝과 시스템 성능 최적화의 핵심 과정이다.
1.2 대기 이벤트가 발생하는 이유
대기 이벤트가 발생하는 주요 원인은 다음과 같다.
- CPU 부족: CPU 사용률이 높은 SQL이 많거나, 특정 SQL이 과도한 연산을 수행하는 경우.
- 디스크 I/O 문제: 데이터를 읽거나 쓰는 과정에서 디스크 접근이 지연되는 경우.
- 메모리 경합: 여러 프로세스가 동시에 메모리를 점유하면서 성능 저하가 발생하는 경우.
- 락(Lock) 충돌: 여러 개의 트랜잭션이 동일한 자원에 접근하면서 충돌이 발생하는 경우.
- 네트워크 대기: 원격 데이터베이스나 외부 시스템과의 통신 속도가 느려지는 경우.
이러한 원인을 파악하고 해결하기 위해서는 대기 이벤트 데이터를 수집하고 분석하는 과정이 필요하다.
2. 주요 대기 이벤트 유형과 분석 방법
대기 이벤트는 크게 CPU 대기, I/O 대기, 락 대기, 네트워크 대기 등의 유형으로 분류할 수 있다.
2.1 CPU 대기 이벤트
대표적인 이벤트:
- CPU 사용량 증가 (on CPU)
- log file sync: 트랜잭션 로그를 디스크에 기록하는 동안 대기 발생
- db file scattered read: 테이블 전체 스캔으로 인해 여러 블록을 읽을 때 발생
CPU 대기 문제 해결 방법:
- 실행 계획을 분석하고 불필요한 연산을 줄이는 SQL 튜닝을 수행한다.
- 인덱스를 활용하여 Full Table Scan을 줄이고 Index Scan으로 변경한다.
- CPU를 많이 사용하는 SQL이 있다면, 배치 스케줄을 조정하여 특정 시간에 실행되도록 최적화한다.
2.2 I/O 대기 이벤트
대표적인 이벤트:
- db file sequential read: 인덱스를 활용하여 데이터를 읽지만, I/O가 지연되는 경우 발생
- db file scattered read: 여러 개의 블록을 동시에 읽을 때 성능 저하가 발생
- direct path read: 대량의 데이터를 읽을 때 발생하는 대기
I/O 대기 문제 해결 방법:
- 인덱스를 재구성하거나, 불필요한 Full Table Scan을 줄이기 위한 SQL 튜닝을 수행한다.
- 데이터를 많이 읽는 SQL을 배치 처리(batch processing) 로 전환한다.
- 디스크 I/O 부하를 줄이기 위해 테이블을 파티셔닝하거나 I/O 분산 전략을 적용한다.
2.3 락(Lock) 대기 이벤트
대표적인 이벤트:
- enq: TX – row lock contention: 여러 트랜잭션이 동일한 행(row)을 수정하려고 할 때 발생
- latch: cache buffers chains: 여러 세션이 동일한 데이터 블록을 동시에 액세스할 때 발생
- library cache lock: SQL이 실행될 때 공유 라이브러리 캐시에 대한 경합이 발생할 때
락 대기 문제 해결 방법:
- 트랜잭션 크기를 줄이고, 필요한 경우 커밋(Commit) 주기를 조정한다.
- 대량 데이터 업데이트는 배치(batch) 처리로 전환하여 경합을 줄인다.
- 멀티테넌트 환경에서는 세션별 리소스 분리를 고려한다.
2.4 네트워크 대기 이벤트
대표적인 이벤트:
- SQL*Net message to/from client: 클라이언트와의 데이터 송수신 속도가 느릴 때 발생
- SQL*Net more data to/from dblink: 분산 데이터베이스에서 원격 데이터 요청이 지연될 때 발생
네트워크 대기 문제 해결 방법:
- SQL 쿼리에서 불필요한 원격 호출을 줄이고, 데이터 압축 기능을 활용한다.
- 네트워크 대역폭을 모니터링하고, 트래픽이 많을 때는 우선순위를 조정한다.
- 멀티 DB 환경에서는 로컬 데이터 캐싱을 활용하여 원격 호출을 최소화한다.
3. ASH를 활용한 대기 이벤트 분석 방법
대기 이벤트를 분석하려면 ASH(Active Session History) 데이터를 활용할 수 있다. 아래 SQL을 사용하면 특정 시간 동안 발생한 대기 이벤트를 조회할 수 있다.
이 데이터를 활용하면 어떤 대기 이벤트가 가장 많이 발생했는지, 그리고 성능 저하의 원인이 무엇인지 분석할 수 있다.
대기 이벤트는 SQL 실행이 지연되는 원인을 분석하는 핵심 요소이며, 이를 정확하게 분석하면 CPU, I/O, 락, 네트워크 문제 등을 해결하여 성능을 최적화할 수 있다.
서버 이관 후 성능 이슈가 발생할 경우, ASH 데이터를 활용하여 특정 SQL이 어떤 이유로 대기하고 있는지 분석하고, 적절한 해결책을 적용하는 것이 중요하다.
'IT > AWR-ASH' 카테고리의 다른 글
SQL 실행 빈도 분석: 가장 많이 실행되는 SQL을 찾아 성능 최적화를 수행하는 방법 (0) | 2025.02.09 |
---|---|
락(Lock) 관련 대기 분석: 테이블 락, 행(Row) 락 등 트랜잭션 대기로 인한 문제 해결 (0) | 2025.02.09 |
디스크 I/O 대기 분석: 디스크 읽기/쓰기 지연이 성능 저하에 미치는 영향 분석 (0) | 2025.02.09 |
CPU 대기 이벤트 분석: CPU 사용량이 높은 SQL을 식별하고 최적화하는 방법 (0) | 2025.02.09 |
ASH 보고서에서 Wait Event 분석하기: 가장 많이 발생하는 대기 이벤트를 식별하는 방법. (0) | 2025.02.09 |
ASH 데이터를 활용한 성능 분석: 특정 시간 동안 실행된 SQL 및 대기 이벤트 분석 (0) | 2025.02.09 |
ASH 보고서 생성 방법: SQL 명령어를 사용하여 ASH 리포트를 생성하는 방법. (0) | 2025.02.09 |
ASH 보고서란?: Oracle Database의 실시간 세션 활동을 분석하는 보고서 (0) | 2025.02.09 |