首页/数据/数据库速查/CPU 飙高排查清单
Redis 运维与场景124 条

CPU 飙高排查清单

CPU 高的四大来源:命令开销(热 key/大命令)、过期与淘汰集中、后台任务(fork/rewrite)、网络与加密(TLS/复制流);用 commandstats 与 persistence 段交叉定位。

数据库速查数据更新于 2026-10-13

CPU 高要去哪里看

Redis 是单线程处理命令的,CPU 飙高基本可以归到四类来源:命令本身的复杂度(大 key、全量遍历、热键集中)、过期与淘汰集中触发、后台任务(快照 fork 与 AOF 重写)、以及网络与加密带来的开销。排查的诀窍是先用 INFO 分段把方向缩小,再决定是改命令、改数据设计还是改部署方式,不要一上来就加机器。

基本信息

适用平台Redis 全版本;字段名随版本略有差异
主要入口INFO cpu、INFO commandstats、INFO stats、INFO persistence
辅助命令SLOWLOG、redis-cli --hotkeys(需 LFU)、--bigkeys
重置统计CONFIG RESETSTAT 可清零累计计数
观察窗口至少覆盖一个完整业务周期

典型使用场景

  • 实例 CPU 长期高于 60%,但慢查询不多
  • 业务高峰期出现响应毛刺,需要区分是命令开销还是后台任务
  • 排查大 key:单个命令扫描数十万成员
  • 过期键集中在同一时刻触发导致的周期性 CPU 峰值
  • 评估加密传输或复制流量带来的额外开销

定位命令

定位命令
INFO cpu                            # 查看 user/sys 时间占比
INFO commandstats | head -20         # 各命令族的调用次数与耗时
SLOWLOG GET 20                       # 最近的慢命令
INFO stats | grep -E 'expired_keys|evicted_keys|instantaneous_ops_per_sec'
INFO persistence | grep -E 'rdb_bgsave_in_progress|aof_rewrite_in_progress|latest_fork_usec'
redis-cli --bigkeys                  # 查找大 key(低峰执行)
CONFIG RESETSTAT                     # 采样前清零,便于观察增量

四类来源与处置

来源判断依据处置方向
命令复杂度commandstats 中某命令族耗时占比高改数据结构、拆分大 key、避免全量遍历
热键集中单键 QPS 占比过高本地缓存、多副本分摊、写合并
过期与淘汰集中expired_keys 与 evicted_keys 出现尖峰打散 TTL、避免同一时刻集体过期
后台任务fork 耗时高或重写进行中关闭 THP、错峰执行、评估内存规模
网络与加密sys 时间占比偏高、TLS 流量大评估启用加密的必要性,减少大响应
commandstats 是累计值:采样前先 CONFIG RESETSTAT,间隔一段时间后再读,才能反映当前窗口的真实分布,否则历史峰值会一直压在榜首。
不要在高峰期执行 --hotkeys 与 --bigkeys:这类命令需要扫描全键空间,本身就是一次可观的 CPU 开销,会把已经偏高的负载再推高一层。

易错点

  • 把 CPU 高统一归因为流量大:过期键集中触发、AOF 重写、大 key 遍历都会造成同样的现象
  • 直接读累计 commandstats 下结论:历史数据掩盖当前分布,采样前应重置统计
  • 在高峰执行扫描类诊断命令:诊断本身成为压垮实例的最后一根稻草
  • 忽略 sys 时间占比:偏高的系统态时间往往指向 THP、网络或换页等系统层问题

数据来源与参考

  • Redis 官方文档: INFO commandstats
  • Redis 官方文档: 延迟排查

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌