Redis가 느려졌습니다. 어디서 병목이 생겼는지 파악해야 합니다. Redis는 자체 모니터링 도구를 제공합니다. 진단을 위한 핵심 명령을 정리합니다.
INFO 명령은 Redis 서버의 전반적인 상태를 반환합니다.
# 전체 정보
INFO
# 특정 섹션만
INFO server
INFO clients
INFO memory
INFO stats
INFO replication
INFO cpu
INFO keyspace
INFO memory
# used_memory_human: 2.50G ← 현재 사용 메모리
# used_memory_peak_human: 3.00G ← 최대 사용 메모리
# mem_fragmentation_ratio: 1.08 ← 단편화 비율 (1.5 이상이면 주의)
# maxmemory_human: 4.00G ← 최대 허용 메모리
INFO stats
# total_commands_processed: 1234567 ← 처리한 명령 수
# instantaneous_ops_per_sec: 15000 ← 초당 처리 명령 수
# keyspace_hits: 980000 ← 캐시 히트 수
# keyspace_misses: 20000 ← 캐시 미스 수
# rejected_connections: 0 ← 거부된 연결 수
INFO clients
# connected_clients: 150 ← 현재 연결 수
# blocked_clients: 5 ← BLPOP 등으로 대기 중인 수
# maxclients: 10000 ← 최대 허용 연결 수
INFO keyspace
# db0:keys=50000,expires=30000,avg_ttl=86400000
# ← 키 50000개, 만료 예약 30000개, 평균 TTL 24시간
메모리 단편화 비율(mem_fragmentation_ratio): 실제 사용 메모리 대비 OS에서 할당된 메모리 비율. 1.0 미만이면 스왑 사용 중(위험), 1.5 이상이면 단편화 심함(재시작 고려).
히트율 = keyspace_hits / (keyspace_hits + keyspace_misses) × 100
예: 980000 / (980000 + 20000) × 100 = 98%
80% 이하면 캐시가 효과를 발휘하지 못하고 있는 것입니다.
기준 시간(마이크로초)을 초과한 명령을 기록합니다.
# 설정 (기본: 10000 마이크로초 = 10ms)
CONFIG SET slowlog-log-slower-than 1000 # 1ms 이상
CONFIG SET slowlog-max-len 100 # 최대 100개 보관
# 느린 명령 조회 (최근 10개)
SLOWLOG GET 10
# 결과 예시
# 1) 1) (integer) 14 ← 로그 ID
# 2) (integer) 1718700000 ← 실행 시각 (Unix timestamp)
# 3) (integer) 15234 ← 소요 시간 (마이크로초, 15.2ms)
# 4) 1) "KEYS" ← 명령
# 2) "*"
# 5) "127.0.0.1:12345" ← 클라이언트 주소
# SLOWLOG 개수 확인
SLOWLOG LEN
# SLOWLOG 초기화
SLOWLOG RESET
KEYS *가 보이면 즉시 SCAN으로 교체해야 합니다.
SLOWLOG: Redis가 내부적으로 기록하는 느린 명령 로그. 명령 실행 시간만 측정하며 네트워크 왕복 시간은 포함하지 않습니다.
실행 중인 모든 명령을 실시간으로 출력합니다.
MONITOR
# OK
# 1718700000.000000 [0 127.0.0.1:12345] "SET" "key1" "value"
# 1718700000.001000 [0 127.0.0.1:12346] "GET" "key2"
# 1718700000.002000 [0 127.0.0.1:12345] "EXPIRE" "key1" "3600"
운영 환경에서는 성능 저하를 유발하므로 디버깅 시 잠시만 사용합니다. 트래픽이 많을수록 MONITOR 자체가 Redis를 느리게 만듭니다.
이벤트별 지연 히스토리를 기록합니다.
# 활성화
CONFIG SET latency-monitor-threshold 1 # 1ms 이상 지연 기록
# 이벤트 목록
LATENCY LATEST
# 1) 1) "command" ← 이벤트 이름
# 2) (integer) 1718700000 ← 마지막 발생 시각
# 3) (integer) 15 ← 마지막 지연 (ms)
# 4) (integer) 200 ← 최대 지연 (ms)
# 히스토리
LATENCY HISTORY command
# 초기화
LATENCY RESET
개발 환경에서 Redis 지연을 인위적으로 만들어 테스트합니다.
DEBUG SLEEP 2 # 2초 동안 Redis 블로킹 (모든 요청 대기)
| 지표 | 명령 | 정상 기준 |
|---|---|---|
| 메모리 사용률 | INFO memory | maxmemory 80% 이하 |
| 캐시 히트율 | INFO stats | 80% 이상 |
| 초당 명령 수 | INFO stats | 서버 사양에 따라 다름 |
| 연결 수 | INFO clients | maxclients의 80% 이하 |
| 단편화 비율 | INFO memory | 1.0 ~ 1.5 |
| 느린 명령 | SLOWLOG | 0건 유지 목표 |
| 복제 지연 | INFO replication | lag 0 ~ 1초 |
INFO memory
# maxmemory_policy: allkeys-lru ← Eviction 정책 확인
# evicted_keys: 1000 ← 강제 삭제된 키 수 증가 중
evicted_keys가 증가한다면 메모리 증설이 필요합니다.
INFO clients
# rejected_connections: 50 ← 거부된 연결 있음
Connection Pool 설정을 재검토하거나 maxclients를 높여야 합니다.
SLOWLOG GET 5
# KEYS *, SMEMBERS(대용량), SORT 같은 O(N) 명령 확인
O(N) 명령을 대체 명령으로 교체하거나 사용 자체를 제한합니다.