나의 잡다한 노트 및 메모
모니터링을 위해 수집되야 할 DB 주요 지표와 의미 본문
PostgreSQL를 모니터링하여 Grafana 대시보드에서 “이 DB가 정상적으로 잘 동작하고 있는가?”를 유의미하게 판단하려면, 리소스 사용 현황과 DB 내부 지표를 균형 있게 모니터링하는 것이 핵심입니다. 아래는 실무에서 많이 활용하는 주요 지표와 각 지표가 의미하는 바를 간략히 정리한 것입니다.
1. Connection & Session
- Active/Idle Connections (현재 연결 수, 상태별)
- # of active connections, # of idle connections, # of idle in transaction 등
- PostgreSQL에서 max_connections에 가깝게 올라가면 신규 연결이 거부될 수 있으므로 주의
- 연결 상태가 “idle in transaction” 상태로 오래 방치되면 리소스 낭비와 잠금 문제의 원인이 될 수 있음
- Max Connections 대비 사용량
- 순간적으로 최대 연결 수에 도달하지 않는지 감시
- 연결 관리(커넥션 풀 사용 등) 상태 파악에 유용
2. Throughput & Query Performance
- TPS(Transactions Per Second), QPS(Queries Per Second)
- 초당 처리되는 트랜잭션(혹은 쿼리) 수, 커밋·롤백 건수
- 애플리케이션 부하가 얼마나 있는지, 트래픽 패턴이 어떤지 파악 가능
- Query Latency (평균/백분위수 응답 시간)
- 쿼리가 얼마나 빠르게 처리되고 있는지, 지연(latency)이 갑자기 높아지지 않는지 확인
- p95, p99 같은 백분위수(latency percentile)를 모니터링하면 스파이크에 대한 조기 감지 가능
- Slow Queries (긴 실행 시간 쿼리 수, Top 쿼리)
- PostgreSQL의 pg_stat_statements 또는 로그 기반으로 상위 느린 쿼리 목록 파악
- 특정 쿼리가 병목 현상을 일으키지 않는지 모니터링
3. Locks & Wait Events
- Locks (Row-level, Table-level), Blocking Sessions
- 잠금 충돌이 잦거나 오래 걸리는 세션이 있는지 확인
- 동시에 실행되는 트랜잭션이 많을 경우 Deadlock 등이 발생할 수 있음
- Wait Events
- PostgreSQL 9.6+부터 지원되는 wait event를 통해, 쿼리나 프로세스가 어떤 이벤트에서 대기하는지 파악
- I/O, Network, LWLock(경량 락) 등 대기 유형별로 병목 지점 확인
4. Replication & WAL (고가용성 환경)
- Replication Lag (Streaming Replication 환경)
- 마스터와 슬레이브(Replica) 간 지연이 없는지 체크
- 로그 전송 속도(WAL Send/Replay) 상태를 모니터링
- 장애 시 Switchover/Failover를 빠르게 결정하기 위해 중요
- WAL Write/Archive 지표
- WAL이 정상적으로 기록·보관되고 있는지
- wal_segment_size, checkpoint 발생 등과도 연관
5. Cache & IO Performance
- Cache Hit Ratio (pg_stat_database: blks_hit / (blks_hit + blks_read))
- PostgreSQL 내부에서 디스크 I/O를 줄이기 위해 얼마나 캐시를 활용하고 있는지
- 캐시 히트율이 낮다면 쿼리 최적화나 메모리 설정(Shared Buffer) 재점검 필요
- Checkpoint Activity / BGWriter Stats
- 체크포인트가 얼마나 자주, 어떻게 발생하는지 (pg_stat_bgwriter)
- 체크포인트가 너무 잦으면 디스크 I/O가 급격히 증가할 수 있음
- Disk I/O Usage (Reads/Writes) & Tablespace Usage
- 디스크 사용량, 읽기/쓰기 IOPS, 테이블스페이스별 용량 모니터링
- 디스크가 가득 차면 장애로 이어질 수 있으므로 선제적으로 확인
6. Table & Row Activity
- Rows Returned/Fetched/Inserted/Updated/Deleted
- pg_stat_database 또는 pg_stat_user_tables 에서 누적 집계
- 트래픽이 높은 테이블, 변경이 많은 테이블 파악에 유용
- Table Size / Index Size / Bloat
- 테이블이나 인덱스가 비정상적으로 커지고 있지 않은지 체크 (pg_class, pg_stat_all_tables 등)
- VACUUM, REINDEX 등을 통해 정리해야 하는 시점을 알 수 있음
- Autovacuum/Manual Vacuum Stats
- autovacuum이 정상적으로 동작하는지, 처리 대상이 많은지 확인
- dead tuple 누적으로 인덱스나 테이블 성능 저하가 생길 수도 있음
7. Resource Usage (시스템 레벨)
- CPU Usage
- DB 서버 CPU 사용량이 갑자기 높아지지 않는지 (DB 프로세스만의 사용량도 중요)
- 일반적으로 TPS/QPS 증가와 함께 CPU도 상승할 수 있으므로 상관관계 파악
- Memory Usage
- DB 서버 전체 메모리 및 PostgreSQL 프로세스의 메모리 사용량
- 커넥션이 폭증하거나 대형 쿼리가 많으면 메모리 부족 현상이 발생할 수 있음
- OS-Level Disk Usage
- DB 파일 시스템이 가득 차지 않는지 모니터링
- 로그 디렉터리, WAL 디렉터리 등 주요 경로에 대한 감시
8. Alerting & Anomaly Detection
- Threshold 기반 알림: ex) DB 커넥션 80% 이상 사용, replication lag 30초 이상, CPU 사용률 90% 초과 등
- 이상 징후 감지: 평소와 다른 급격한 메트릭 변동(트래픽 폭증, Latency 스파이크, Cache Hit Ratio 급감 등)을 빠르게 인지