redis占用cpu较高排查
问题背景介绍
Redis 作为高性能的内存数据库被广泛应用于缓存、会话存储、消息队列等场景。然而,在生产环境中,我们经常会遇到 Redis 容器 CPU 使用率突然飙高的情况,这不仅会影响 Redis 自身的性能,还可能对同一节点上的其他应用造成资源争抵,甚至导致整个系统的不稳定。
近期,我们的生产环境中一个 Redis 容器出现了 CPU 使用率持续高达 90%以上的异常情况,与平时 20%左右的使用率形成鲜明对比。更为严重的是,这导致了业务接口响应时间增加、超时率上升,需排查解决。
排查过程
- Redis 内部运行状态分析
# 查看CPU使用情况
127.0.0.1:6379> INFO CPU
used_cpu_sys:35986.54
used_cpu_user:76382.22
used_cpu_sys_children:0.00
used_cpu_user_children:0.00
# 查看命令统计
127.0.0.1:6379> INFO commandstats
cmdstat_get:calls=1245,usec=7890,usec_per_call=6.34
cmdstat_set:calls=652,usec=4325,usec_per_call=6.63
cmdstat_keys:calls=325,usec=187650,usec_per_call=577.38
cmdstat_scan:calls=136,usec=65430,usec_per_call=481.10
cmdstat_del:calls=189,usec=1203,usec_per_call=6.37
# 从命令统计可以看出,keys和scan命令虽然调用次数不是最多的,但每次调用的耗时却非常高,这是一个值得关注的点。
- 慢查询日志分析
# 查看慢查询配置
127.0.0.1:6379> CONFIG GET slowlog-*
1) "slowlog-log-slower-than"
2) "10000" # 10毫秒
3) "slowlog-max-len"
4) "128"
# 获取慢查询日志
127.0.0.1:6379> SLOWLOG GET 10
1) 1) (integer) 142
2) (integer) 1633432982
3) (integer) 587345
4) 1) "keys"
2) "*user:profile*"
2) 1) (integer) 141
2) (integer) 1633432975
3) (integer) 498234
4) 1) "keys"
2) "*session*"
# 慢查询日志显示,有多个keys命令执行时间超过了设定的阈值,而且使用了通配符模式进行查询,这在键值较多的情况下会非常消耗 CPU 资源。
- 连接与客户端分析
# 查看客户端连接信息
127.0.0.1:6379> INFO clients
connected_clients:245
client_recent_max_input_buffer:8
client_recent_max_output_buffer:1
blocked_clients:0
tracking_clients:0
clients_in_timeout_table:175
# 当前有 245 个客户端连接,其中 175 个处于超时表中,这表明可能有大量的空闲连接没有被正确关闭。
- 大 key 分析
# 使用 Redis 自带的工具分析大 key:
redis-cli --bigkeys
# 输出摘要
-------- summary -------
Sampled 1000000 keys in the keyspace!
Total key length in bytes is 52686875 (avg len 52.69)
Biggest list found 'delayed:jobs' has 154345 items
Biggest hash found 'user:12345:data' has 3210 fields
Biggest string found 'cache:html:homepage' has 1823045 bytes
Biggest set found 'online:users' has 62345 members
Biggest zset found 'leaderboard:daily' has 10000 members
# 分析显示有一些明显的大 key,特别是delayed:jobs列表含有大量元素,cache:html:homepage字符串非常大。
问题原因定位与解决
结合以上排查结果,我们可以确定导致 Redis 容器 CPU 飙高的主要原因:
- 高复杂度命令频繁执行:keys命令在生产环境中被频繁调用,这是一个 O(N)复杂度的命令,当键值对数量较多时会严重消耗 CPU 资源。
- 大 key 处理不当:存在多个大型数据结构,如大列表和大字符串,这些结构的操作也会消耗更多的 CPU 资源。
- 客户端连接管理问题:大量客户端连接且部分处于超时状态,增加了 Redis 的连接管理开销。

浙公网安备 33010602011771号