This guide outlines steps to analyze Redis performance issues, particularly focusing on latency problems and ensuring data safety before restart procedures.
redis-cli INFO memoryKey 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 persistenceCritical 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 cpuMonitor:
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 keyspaceAnalyze:
- Number of keys per database
- Expiration settings
- Key distribution
redis-cli INFO statsImportant metrics:
total_connections_receivedrejected_connectionskeyspace_hitskeyspace_misseslatest_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 keynameRegular monitoring using these commands helps identify issues before they become critical. Always ensure proper persistence configuration before any restart procedure.