Диагностика проблем, мониторинг, логи, slow log, Redis Insight
Диагностика проблем Redis требует понимания метрик, логов и инструментов. Эта тема покрывает slow log, latency monitoring, MEMORY DOCTOR, Redis Insight и production мониторинг.
Slow log логирует запросы медленнее указанного порога.
# redis.conf
# Порог в микросекундах (10000 мкс = 10 мс)
slowlog-log-slower-than 10000
# Максимум записей в логе
slowlog-max-len 128# Получить последние 10 медленных запросов
SLOWLOG GET 10
# Получить все записи
SLOWLOG GET
# Количество записей
SLOWLOG LEN
# Очистить лог
SLOWLOG RESET127.0.0.1:6379> SLOWLOG GET 5
1) 1) (integer) 1234
2) (integer) 1709395200
3) (integer) 15234 # Время выполнения в микросекундах (15.2 мс)
4) 1) "KEYS"
2) "user:*"
5) "192.168.1.50:54321" # Клиент
6) "MyApp" # Имя клиента
2) 1) (integer) 1233
2) (integer) 1709395190
3) (integer) 12045
4) 1) "HGETALL"
2) "large:hash:key"| Команда | Проблема | Решение |
|---|---|---|
KEYS pattern | O(N) сканирование всех ключей | Использовать SCAN |
HGETALL large_hash | Чтение большого объекта | Использовать HSCAN или получать по полям |
SMEMBERS large_set | Чтение большого множества | Использовать SSCAN |
LRANGE list 0 -1 | Чтение всего списка | Указать диапазон или использовать LTRIM |
DEL large_key | Удаление большого ключа | Удалять постепенно или использовать UNLINK |
# Мониторинг latency в реальном времени
redis-cli --latency
# Вывод: min: 0, max: 5, avg: 1.23
# История latency (с интервалом)
redis-cli --latency-history -i 1
# Latency для конкретной команды
redis-cli --latency-dist -h localhost
# Анализ причин latency
redis-cli LATENCY DOCTOR
# История latency событий
redis-cli LATENCY HISTORY
# График latency (в терминале)
redis-cli LATENCY GRAPH# I can report the following latency events:
#
# command: 1 instances detected.
# max: 15ms, avg: 12ms
# Advice: Check slow log for slow commands
#
# fork: 2 instances detected.
# max: 25ms, avg: 20ms
# Advice: BGSAVE/BGREWRITEAOF causing latency spikes
#
# Summary:
# - Fork operations are causing latency due to large dataset
# - Consider scheduling BGSAVE during low-traffic periods
MEMORY DOCTOR анализирует использование памяти и даёт рекомендации.
127.0.0.1:6379> MEMORY DOCTOR
Sam, I have a few reports for you:
* High memory fragmentation: The allocator is using 1.35GB of RSS memory
to store 1GB of data. This is a fragmentation ratio of 35%.
Advice: Consider restarting Redis or using MEMORY PURGE.
* Big keys detected: The key 'large:hash:123' is using 50MB of memory.
Advice: Consider splitting this key into smaller keys.
* High peak memory: Peak memory was 1.5GB, current is 1GB.
Advice: Consider setting maxmemory to prevent future peaks.
Overall: Your memory usage looks acceptable, but monitor fragmentation.# Найти самые большие ключи
redis-cli --bigkeys
# Вывод:
# Scanning the entire keyspace to find biggest keys...
#
# Biggest hash found: user:12345:cache (52428800 bytes)
# Biggest list found: queue:tasks (10485760 bytes)
# Biggest set found: tags:popular (5242880 bytes)
# Biggest zset found: leaderboard:global (2097152 bytes)
# Biggest string found: backup:full:20260302 (104857600 bytes)
# Размер конкретного ключа
redis-cli MEMORY USAGE user:12345:cache
# 52428800
# Детальная информация о ключе
redis-cli MEMORY STATSRedis Insight — официальный GUI от Redis Ltd для мониторинга и управления.
# Docker
docker run -d -p 8001:8001 redis/redisinsight:latest
# Подключение к localhost:6379 через веб-интерфейс http://localhost:8001# Получить все метрики
INFO ALL
# Или по секциям
INFO server
INFO memory
INFO persistence
INFO stats
INFO replication
INFO clusterINFO memory
# Ключевые:
used_memory: 1073741824 # 1GB данных
used_memory_rss: 1394630656 # 1.3GB процесса (OS)
used_memory_peak: 1610612736 # Пик 1.5GB
used_memory_lua: 102400 # Lua память
maxmemory: 2147483648 # Лимит 2GB
mem_fragmentation_ratio: 1.30 # 30% фрагментация
mem_allocator: jemalloc-5.2.1INFO stats
# Ключевые:
total_connections_received: 100000
total_commands_processed: 50000000
instantaneous_ops_per_sec: 5000 # Текущий throughput
rejected_connections: 0 # Отклонённые подключения
sync_full: 0 # Полные синхронизации реплик
sync_partial_ok: 5 # Частичные синхронизации
expired_keys: 10000 # Истёкшие ключи
evicted_keys: 0 # Вытесненные ключи
keyspace_hits: 900000 # Попадания в кэш
keyspace_misses: 100000 # Промахи
hit_rate: 90% # (hits / (hits + misses))INFO persistence
# RDB:
rdb_changes_since_last_save: 100
rdb_last_bgsave_time_sec: 5
rdb_last_bgsave_status: ok
rdb_last_save_time: 1709395200
# AOF:
aof_enabled: 1
aof_rewrite_in_progress: 0
aof_last_rewrite_time_sec: 10
aof_last_bgrewrite_status: ok
aof_current_size: 104857600 # 100MB
aof_base_size: 52428800 # 50MB после последнего rewrite# docker-compose.yml для мониторинга
version: '3.8'
services:
redis:
image: redis:7-alpine
ports:
- "6379:6379"
redis-exporter:
image: oliver006/redis_exporter
ports:
- "9121:9121"
environment:
- REDIS_ADDR=redis:6379
- REDIS_PASSWORD=redis-password
prometheus:
image: prom/prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
grafana:
image: grafana/grafana
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
grafana_data:# prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'redis'
static_configs:
- targets: ['redis-exporter:9121']# alerts.yml
groups:
- name: redis
rules:
- alert: RedisDown
expr: redis_up == 0
for: 1m
annotations:
summary: "Redis instance is down"
description: "Redis {{ $labels.instance }} is not responding"
- alert: RedisHighMemory
expr: redis_memory_used_bytes / redis_memory_max_bytes > 0.9
for: 5m
annotations:
summary: "Redis memory usage is high"
description: "Memory usage is {{ $value | humanizePercentage }}"
- alert: RedisHighFragmentation
expr: redis_mem_fragmentation_ratio > 1.5
for: 10m
annotations:
summary: "Redis memory fragmentation is high"
description: "Fragmentation ratio is {{ $value }}"
- alert: RedisLowHitRate
expr: redis_keyspace_hits / (redis_keyspace_hits + redis_keyspace_misses) < 0.8
for: 10m
annotations:
summary: "Redis cache hit rate is low"
description: "Hit rate is {{ $value | humanizePercentage }}"
- alert: RedisRejectedConnections
expr: rate(redis_rejected_connections_total[1m]) > 0
for: 1m
annotations:
summary: "Redis is rejecting connections"
description: "Rejected connections: {{ $value }}"
- alert: RedisPersistenceError
expr: redis_rdb_last_bgsave_status != 1 or redis_aof_last_bgrewrite_status != 1
for: 1m
annotations:
summary: "Redis persistence failed"
description: "Last persistence operation failed"# 1. Проверка использования памяти
INFO memory
# 2. Поиск больших ключей
redis-cli --bigkeys
# 3. Проверка фрагментации
INFO memory | grep fragmentation
# 4. Рекомендации
MEMORY DOCTOR
# 5. Очистка фрагментации (если безопасно)
MEMORY PURGE
# 6. Удаление старых ключей
SCAN 0 MATCH pattern:* COUNT 1000
# Затем DEL найденных ключей# 1. Проверка hit rate
INFO stats | grep keyspace
# 2. Анализ TTL ключей
SCAN 0 COUNT 1000
# Проверить TTL ключей
# 3. Проверка eviction
INFO stats | grep evicted
# 4. Увеличение maxmemory или изменение policy
CONFIG SET maxmemory 4gb
CONFIG SET maxmemory-policy allkeys-lru# 1. Проверка slow log
SLOWLOG GET 10
# 2. Анализ latency
LATENCY DOCTOR
# 3. Поиск проблемных команд
# Если KEYS — заменить на SCAN
# Если HGETALL большого hash — использовать HSCAN
# 4. Проверка fork latency (BGSAVE)
INFO persistence | grep rdb_last_bgsave# 1. Проверка статуса репликации
INFO replication
# 2. Ключевые метрики:
# master_repl_offset - slave_repl_offset = lag
# slave_state: online/wait
# 3. Проверка сети между master и slave
ping <slave-ip>
# 4. Увеличение backlog
CONFIG SET repl-backlog-size 256mb
# 5. Проверка нагрузки на master
INFO stats | grep instantaneous_ops| Проблема | Команда для диагностики |
|---|---|
| Медленные запросы | SLOWLOG GET, LATENCY DOCTOR |
| Высокая память | INFO memory, MEMORY DOCTOR, --bigkeys |
| Низкий hit rate | INFO stats (keyspace_hits/misses) |
| Проблемы репликации | INFO replication |
| Проблемы персистентности | INFO persistence |
| Fragmentation | INFO memory (fragmentation_ratio) |
| Подключения | INFO clients, CLIENT LIST |
| Cluster проблемы | CLUSTER INFO, CLUSTER NODES |
Проверьте понимание → ответьте на вопросы в troubleshooting.json
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.