1、一张表:10 秒自检清单
排查项 | 快速行动 |
---|---|
慢命令 | 打开 SLOWLOG get ,禁止在生产跑 KEYS /FLUSH* 等 O(N) 指令 |
实例类型 | EC2 请换 HVM (如 m5.* ),KVM/LXC 一般 OK |
THP | echo never > /sys/kernel/mm/transparent_hugepage/enabled |
内核基线 | redis-cli --intrinsic-latency 100 (在服务器本机跑) |
Latency Monitor | CONFIG SET latency-monitor-threshold 100 |
持久化策略 | 按可靠性→性能排序 ① AOF+fsync always ② AOF+everysec ③ AOF+everysec +no-appendfsync-on-rewrite ④ AOF+fsync never ⑤ 纯 RDB (看 save 点) |
2、延迟到底怎么量?
bash
# 实时查看命令往返延迟
redis-cli -h <host> -p <port> --latency
- 默认周期性打印 P50/P95/max。
- 另有混合视图:
--latency-dist
。
内置延迟监控
bash
# 1ms 以上事件记录
CONFIG SET latency-monitor-threshold 1000
LATENCY DOCTOR # 人类可读分析
LATENCY GRAPH event # ASCII 折线图
3、Intrinsic Latency:先测宿主机底线
bash
redis-cli --intrinsic-latency 100 # 100 秒
- 物理机:常见 < 0.2 ms
- Xen/KVM 低配虚机:可见 5~40 ms
- 这是 系统能给的最好延迟,Redis 不可能突破它。
4、网络往返 & Pipeline 优化
建议 | 说明 |
---|---|
长连接 | 避免频繁 connect/close |
Unix Domain Socket | Client 与 Server 同机 |
Pipeline / MGET | 多命令合并,减少 RTT |
Server & Client 绑核 | NUMA/CPU cache locality |
5、单线程 + 慢命令
Redis 主线程一次只能执行 一个命令,遇到 O(N) 指令就会阻塞其它请求。
高危指令 Top List
类型 | 指令 |
---|---|
全 Key 空间 | KEYS , SCAN 大范围、FLUSHALL |
集合运算 | SUNION , SMEMBERS , ZRANGE ... WITHSCORES |
列表裁剪 | LREM , SORT 无 LIMIT |
排查 :
SLOWLOG get 20
看执行时间;或开启CONFIG SET slowlog-log-slower-than
。
方案
- 改写业务逻辑避免大集合。
- 读副本跑慢查询。
6、fork、THP 与虚机
6.1 BGSAVE/BGREWRITEAOF 的 fork 开销
场景 | 复制 Page Table (ms/GB) |
---|---|
物理机 (Xeon) | ~10 ms |
EC2 HVM m5.large |
~10 ms |
旧型 EC2 Xen | 200+ ms |
Linode Xen | 400+ ms |
应对
- 选新一代 HVM 实例或物理机
- 不要在同机运行 IO 密集服务
6.2 Transparent Huge Pages
echo never > /sys/kernel/mm/transparent_hugepage/enabled
避免写时复制放大、CPU stall。
7、Swap & 内存压力
bash
# 查看进程 swap 用量
grep -i swap /proc/`pidof redis-server`/smaps | awk '{s+=$2} END {print s/256 " MB"}'
# 监控 Swap 活动
vmstat 1 # 看 si/so 列
- 大量 swap ⇒ 必有 延迟尖刺。
- 解决:加内存 / 降低 maxmemory / 关闭 Linux swappiness。
8、 AOF fsync 策略三兄弟
配置 | 可靠性 | 延迟风险 |
---|---|---|
appendfsync always |
最安全 | 高,fsync 每次 |
everysec (默认) |
丢 ≤1 s 数据 | 中,fsync 后台线程 |
no |
依赖 OS flush | 最低,但可能丢分钟级 |
观察 :
INFO persistence
→aof_current_fsync_offset
、aof_last_write_latency_ms
。
strace -fp $(pidof redis-server) -e trace=fdatasync -T
看卡在哪。
9、大批量过期键也会卡住主线程
- Redis 每 100 ms 随机抽 20 个带过期键。
- 如抽样 >25% 已过期 ⇒ 循环 清理直到 <25%。
- 若你的应用把 上百万键设在同一秒过期,就会卡。
优化:
- 过期时间做随机抖动。
- 使用
UNLINK
异步删除 (4.0+)。
10、软件看门狗:最后的「核武器」
bash
CONFIG SET watchdog-period 500 # 500ms 卡顿即打栈
- 遇到超过阈值的阻塞会在日志打印 C 栈 + 寄存器。
- 仅用于线上难以复现的莫名卡顿,完事记得
watchdog-period 0
关闭。