This guide outlines steps to analyze Redis performance issues, particularly focusing on latency problems and ensuring data safety before restart procedures.
redis-cli INFO memory
Key metrics to watch:
used_memory_human
: Total memory used by Redisused_memory_rss_human
: Total memory used from system perspectiveused_memory_peak_human
: Peak memory consumedmem_fragmentation_ratio
: > 1.5 indicates significant fragmentationmem_allocator
: Memory allocator in use
redis-cli INFO persistence
Critical metrics:
rdb_last_save_time
: Timestamp of last successful saverdb_changes_since_last_save
: Number of changes since last dumprdb_last_bgsave_status
: Must be "ok" for safe restartrdb_last_save_time_sec
: How long last save tookrdb_current_bgsave_time_sec
: Current save progress if running
Example healthy output:
rdb_last_save_time:1612137171
rdb_changes_since_last_save:0
rdb_last_bgsave_status:ok
redis-cli INFO cpu
Monitor:
used_cpu_sys
: System CPU consumed by Redisused_cpu_user
: User CPU consumed by Redisused_cpu_sys_children
: System CPU consumed by background processesused_cpu_user_children
: User CPU consumed by background processes
redis-cli INFO keyspace
Analyze:
- Number of keys per database
- Expiration settings
- Key distribution
redis-cli INFO stats
Important metrics:
total_connections_received
rejected_connections
keyspace_hits
keyspace_misses
latest_fork_usec
: Time taken for last fork operation
Verify in redis.conf:
# Snapshot settings
save 900 1 # After 900 sec if at least 1 change
save 300 10 # After 300 sec if at least 10 changes
save 60 10000 # After 60 sec if at least 10000 changes
# Directory settings
dir /var/lib/redis
dbfilename dump.rdb
# Check Redis working directory
ls -la /var/lib/redis/
# Verify dump file permissions
ls -la /var/lib/redis/dump.rdb
# Manual save test
redis-cli SAVE
# Verify save success
redis-cli INFO persistence | grep rdb_last_save
# Monitor command latency
redis-cli --latency
# Detailed latency analysis
redis-cli LATENCY DOCTOR
# Check if swapping is occurring
redis-cli INFO stats | grep process_id
ps -o majflt,minflt -p <pid>
# Monitor slow commands
redis-cli SLOWLOG GET 10
# Reset slow log if needed
redis-cli SLOWLOG RESET
- Verify persistence configuration is active:
redis-cli CONFIG GET save
- Check last successful save:
redis-cli INFO persistence | grep rdb_last_save
- Trigger manual save:
redis-cli SAVE
- Verify save file:
ls -la /var/lib/redis/dump.rdb
- Document current metrics:
redis-cli INFO memory
redis-cli DBSIZE
- Check data persistence:
redis-cli DBSIZE # Compare with pre-restart value
redis-cli INFO keyspace
- Verify performance improvement:
redis-cli --latency
redis-cli INFO memory # Check fragmentation ratio
- Monitor file descriptors:
redis-cli INFO clients | grep connected_clients
- Check client connections:
redis-cli CLIENT LIST | wc -l
- AOF status (if enabled):
redis-cli INFO persistence | grep aof
# Check total memory usage
redis-cli INFO memory | grep used_memory_human
# Count total keys
redis-cli DBSIZE
# Count keys by pattern (be careful on production)
redis-cli --scan --pattern '*' | wc -l
# Get key counts by database
redis-cli INFO keyspace
# Analyze key distribution and sizes
redis-cli --bigkeys
# Check if approaching system memory
redis-cli INFO memory | grep maxmemory_human
# Sample key patterns to identify potential issues
redis-cli --scan --pattern '*' | head -n 10
# Check key age and expiration
# Get keys with TTL
redis-cli --scan | xargs -L 100 redis-cli TTL
# Find keys without expiration (TTL = -1)
redis-cli --scan | xargs -L 100 redis-cli TTL | grep -c -- -1
# Check for keys with specific patterns and their TTLs
redis-cli --scan --pattern 'pattern:*' | xargs -L 100 redis-cli TTL
# Get key idle time (how long since last access)
redis-cli OBJECT IDLETIME keyname
# Sample idle time for random keys
redis-cli --scan --pattern '*' | head -n 50 | xargs -L 1 redis-cli OBJECT IDLETIME
# Get creation time of keys (if available)
redis-cli OBJECT FREQ keyname
# Check total memory usage
redis-cli INFO memory | grep used_memory_human
# Count total keys
redis-cli DBSIZE
# Count keys by pattern (be careful on production)
redis-cli --scan --pattern '*' | wc -l
# Get key counts by database
redis-cli INFO keyspace
# Analyze key distribution and sizes
redis-cli --bigkeys
# Check if approaching system memory
redis-cli INFO memory | grep maxmemory_human
# Sample key patterns to identify potential issues
redis-cli --scan --pattern '*' | head -n 10
# Check key age and expiration
# Get keys with TTL
redis-cli --scan | xargs -L 100 redis-cli TTL
# Find keys without expiration (TTL = -1)
redis-cli --scan | xargs -L 100 redis-cli TTL | grep -c -- -1
# Check for keys with specific patterns and their TTLs
redis-cli --scan --pattern 'pattern:*' | xargs -L 100 redis-cli TTL
# Get key idle time (how long since last access)
redis-cli OBJECT IDLETIME keyname
# Sample idle time for random keys
redis-cli --scan --pattern '*' | head -n 50 | xargs -L 1 redis-cli OBJECT IDLETIME
# Get creation time of keys (if available)
redis-cli OBJECT FREQ keyname
Regular monitoring using these commands helps identify issues before they become critical. Always ensure proper persistence configuration before any restart procedure.