Wait Event 클래스의 개요
| 클래스 | 설명 | 예시 이벤트 |
|---|
LWLock (Lightweight Lock) | PostgreSQL 내부 자원 동기화용 락 | BufferContent, WALInsert |
Lock | SQL에서 명시적으로 사용하는 테이블/행 락 | relation, tuple, transactionid |
IO | 디스크 읽기/쓰기 대기 | DataFileRead, DataFileWrite |
Client | 클라이언트 응답 대기 | ClientRead, ClientWrite |
IPC | 프로세스 간 통신 대기 | LatchWait, ConditionVariable |
Timeout | 일정 시간 대기 설정 | StatementTimeout, LockTimeout |
Activity | 프로세스가 작업 중임을 나타냄 | AutoVacuumMain, BgWriterHibernate |
Extension | 확장 기능에서 발생한 대기 | pg_stat_statements 등 사용자 확장 |
BufferPin | 버퍼 고정으로 인한 대기 | 다른 세션이 페이지 고정 중 |
WAL | Write-Ahead Logging 작업 대기 | WALWrite, WALSync |
쿼리 Wait Event 상태 확인
SELECT pid, state, wait_event_type, wait_event, query
FROM pg_stat_activity
WHERE state <> 'idle';
| 컬럼 | 설명 |
|---|
state | active / idle in transaction 등 |
wait_event_type | 위에서 본 클래스 명 |
wait_event | 실제 이벤트 명 |
query | 현재 실행 중인 쿼리 |
예시 결과
| pid | wait_event_type | wait_event | query |
|---|
| 12345 | Lock | relation | UPDATE users SET ... |
| 23456 | IO | DataFileRead | SELECT * FROM orders WHERE id=... |
대표적인 성능 병목 사례
| 상황 | 원인 | Wait Event 예시 | 대응 방안 |
|---|
| 쿼리 실행 느림 | 디스크 I/O 병목 | DataFileRead | 인덱스 추가, 메모리 설정 증가 |
| 락 경합 | 테이블/행에 다중 접근 | tuple, relation | 트랜잭션 짧게, Lock 분리 |
| WAL 병목 | 많은 쓰기 작업 | WALWrite, WALSync | WAL 설정 최적화, SSD 사용 권장 |
| Autovacuum 지연 | 내부 버퍼 충돌 | BufferContent | Autovacuum 튜닝 |
분석 도구 예시
- pg_stat_activity: 현재 쿼리 대기 상태 파악
- pg_stat_io / pg_stat_database: I/O 비중 확인
- pg_stat_lwlock: LWLock 경쟁률 확인
- pg_blocking_pids(pid): 어떤 세션이 막고 있는지 추적
SELECT pg_blocking_pids(12345);