Redis 线上问题排查完整手册
目录
问题分类与快速定位
1. 性能问题
现象:
- 响应时间增加,P99延迟上升
- QPS下降,吞吐量不足
- CPU使用率异常(过高或过低)
快速检查命令:
# 检查基本信息
redis-cli info stats
redis-cli info replication
redis-cli info memory
# 检查慢查询
redis-cli slowlog get 10
# 实时监控命令执行
redis-cli monitor
2. 内存问题
现象:
- 内存使用率持续上升
- 出现OOM错误
- 键过期不及时
快速检查:
# 内存使用详情
redis-cli info memory
# 检查大键
redis-cli --bigkeys
# 内存使用分析
redis-cli memory usage <key>
redis-cli memory stats
3. 连接问题
现象:
- 连接超时或拒绝
- 连接数异常
- 客户端频繁重连
快速检查:
# 连接信息
redis-cli info clients
redis-cli client list
# 网络连接检查
netstat -an | grep :6379
ss -tulpn | grep :6379
性能问题排查
1. 慢查询分析
# 设置慢查询阈值(微秒)
CONFIG SET slowlog-log-slower-than 10000
# 设置慢查询记录数量
CONFIG SET slowlog-max-len 1000
# 查看慢查询
SLOWLOG GET 20
# 查看慢查询统计
SLOWLOG LEN
# 清空慢查询日志
SLOWLOG RESET
2. 热点键分析
# 实时监控(生产环境谨慎使用)
redis-cli monitor | head -n 1000
# 使用采样监控
redis-cli --latency-history -i 1
# 检查键的访问频率(Redis 4.0+)
redis-cli --hotkeys
3. 延迟诊断
# 延迟测试
redis-cli --latency
redis-cli --latency-history
redis-cli --latency-dist
# 内在延迟测试
redis-cli --intrinsic-latency 60
# 网络延迟测试
ping <redis-server-ip>
4. QPS和吞吐量监控
# 实时统计信息
redis-cli --stat
# 每秒命令执行数
redis-cli info stats | grep instantaneous_ops_per_sec
# 网络吞吐量
redis-cli info stats | grep instantaneous_input_kbps
redis-cli info stats | grep instantaneous_output_kbps
内存问题诊断
1. 内存使用分析
# 详细内存信息
redis-cli info memory
# 关键指标说明:
# used_memory: 实际使用内存
# used_memory_rss: 系统分配内存
# used_memory_peak: 历史最大内存使用
# mem_fragmentation_ratio: 内存碎片率
2. 大键检测
# 扫描大键(会影响性能)
redis-cli --bigkeys
# 指定数据库扫描
redis-cli -n 1 --bigkeys
# 采样扫描(降低影响)
redis-cli --bigkeys -i 0.01
3. 键空间分析
# 键的内存使用
redis-cli memory usage <key>
# 获取键类型和TTL
redis-cli type <key>
redis-cli ttl <key>
# 扫描键模式
redis-cli --scan --pattern "prefix:*"
4. 内存碎片处理
# 检查碎片率
redis-cli info memory | grep mem_fragmentation_ratio
# 主动碎片整理(Redis 4.0+)
CONFIG SET activedefrag yes
CONFIG SET active-defrag-ignore-bytes 100mb
CONFIG SET active-defrag-threshold-lower 10
# 手动触发碎片整理
MEMORY PURGE
连接与网络问题
1. 连接数监控
# 当前连接信息
redis-cli info clients
# 客户端列表
redis-cli client list
# 按类型统计连接
redis-cli client list | awk '{print $3}' | sort | uniq -c
# 关闭空闲连接
redis-cli client kill type normal idle 300
2. 连接池配置检查
# 最大连接数
CONFIG GET maxclients
# 超时设置
CONFIG GET timeout
# TCP保活设置
CONFIG GET tcp-keepalive
3. 网络问题诊断
# 网络连通性测试
telnet <redis-ip> 6379
nc -zv <redis-ip> 6379
# 防火墙检查
iptables -L | grep 6379
# 端口监听状态
netstat -tlnp | grep 6379
ss -tlnp | grep 6379
4. SSL/TLS问题
# SSL连接测试
redis-cli --tls --cert ./client.crt --key ./client.key --cacert ./ca.crt
# 证书验证
openssl s_client -connect <redis-ip>:6380 -cert client.crt -key client.key
常用排查命令
1. 信息查询命令
# 服务器信息
INFO server
INFO clients
INFO memory
INFO persistence
INFO stats
INFO replication
INFO cpu
INFO cluster
INFO keyspace
# 配置查询
CONFIG GET "*"
CONFIG GET maxmemory
CONFIG GET save
2. 实时监控命令
# 命令监控
MONITOR
# 发布订阅监控
PSUBSCRIBE __keyevent@0__:*
# 客户端监控
CLIENT LIST
CLIENT TRACKING ON
3. 调试命令
# 对象调试
DEBUG OBJECT <key>
# 段错误调试
DEBUG SEGFAULT
# 内存报告
MEMORY DOCTOR
# 延迟监控
LATENCY MONITOR
LATENCY LATEST
LATENCY HISTORY <event>
监控指标分析
1. 核心性能指标
# QPS相关
instantaneous_ops_per_sec # 每秒操作数
total_commands_processed # 总命令数
# 延迟相关
latency_percentiles_usec # 延迟百分位数
avg_ttl # 平均TTL
# 内存相关
used_memory # 使用内存
used_memory_rss # RSS内存
mem_fragmentation_ratio # 碎片率
# 连接相关
connected_clients # 连接数
blocked_clients # 阻塞客户端数
2. 关键阈值设置
# 内存告警阈值
used_memory > maxmemory * 0.8
mem_fragmentation_ratio > 1.5
# 性能告警阈值
instantaneous_ops_per_sec < 1000
slowlog_len > 100
# 连接告警阈值
connected_clients > maxclients * 0.8
blocked_clients > 10
应急处理方案
1. 内存不足处理
# 立即释放内存
FLUSHDB # 清空当前数据库
FLUSHALL # 清空所有数据库
# 删除大键
UNLINK <big-key> # 异步删除
# 调整内存策略
CONFIG SET maxmemory-policy allkeys-lru
CONFIG SET maxmemory <new-limit>
2. 性能急剧下降处理
# 禁用危险命令
CONFIG SET rename-command-keys ""
CONFIG SET rename-command-flushall ""
# 限制慢查询
CONFIG SET slowlog-log-slower-than 1000
# 重启服务(最后手段)
sudo systemctl restart redis
3. 连接问题处理
# 清理僵尸连接
CLIENT KILL TYPE normal IDLE 300
# 增加连接限制
CONFIG SET maxclients 20000
# 启用连接池
CONFIG SET tcp-keepalive 60
性能优化建议
1. 配置优化
# 内存优化
maxmemory-policy allkeys-lru # 内存淘汰策略
hash-max-ziplist-entries 512 # 哈希压缩阈值
list-max-ziplist-size -2 # 列表压缩设置
# 持久化优化
save "" # 禁用RDB(如果不需要)
appendonly yes # 启用AOF
appendfsync everysec # AOF同步策略
# 网络优化
tcp-keepalive 60 # TCP保活
timeout 300 # 客户端超时
2. 运维优化
# 操作系统优化
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo 1 > /proc/sys/vm/overcommit_memory
echo 511 > /proc/sys/net/core/somaxconn
# 文件描述符限制
ulimit -n 65535
# 内存分配
echo vm.swappiness=1 >> /etc/sysctl.conf
3. 应用层优化
# 连接池配置
max_connections=20 # 最大连接数
min_idle_connections=5 # 最小空闲连接
max_idle_time=300 # 最大空闲时间
# 命令优化
# 使用PIPELINE批量操作
# 避免KEYS命令,使用SCAN替代
# 合理设置TTL,避免内存泄漏
# 使用合适的数据结构
故障排查流程图
- 问题发现 → 监控告警或用户反馈
- 初步判断 → 查看基本信息和日志
- 定位问题 → 使用相应诊断命令
- 分析原因 → 结合监控数据分析
- 制定方案 → 选择合适的解决方案
- 执行处理 → 谨慎执行修复操作
- 验证效果 → 确认问题已解决
- 总结优化 → 防止问题再次发生
联系方式与备注
使用说明:
- 生产环境执行命令前务必谨慎评估影响
- MONITOR、KEYS等命令会影响性能,请在业务低峰期使用
- 重要操作前建议先备份数据
- 配置修改建议先在测试环境验证
更新时间: 2024年最新版本
适用版本: Redis 5.0+ (部分命令需要更高版本)