广告图片
TOP云-靠谱的企业级公有云服务平台

云服务器、物理服务器、云安全、SSL证书限时3折抢购!

双路E5-2640V4(40核)64G内存480G SSD硬盘30M独享带宽物理机仅需368元;香港铂金云服务器2H/2G/15M仅需19.8元/月;4H/4G/25M仅需29.8元/月,

TOP云-靠谱的企业级公有云服务平台:双路E5-2640V4(40核)64G内存480G SSD硬盘30M独享带宽物理机仅需368元;香港铂金云服务器2H/2G/15M仅需19.8元/月;4H/4G/25M仅需29.8元/月,云服务器、物理服务器、云安全、SSL证书限时3折抢购!点击这里立即抢购! 展开广告

TOP云物理服务器特惠,CPU可选双路E5-2660(32核)、双路E5-2680v2(40核)、双路E5-2696/98 V4(88核)、双路Gold 6138(80核)、双路Platinum 8173(112核);

内存从32G-128G可选,带宽有单线、多线独享20M-200M,价格低至368元。

购买链接:https://c.topyun.vip/cart?fid=1&gid=236

服务器Redis CPU飙升?频繁key过期与持久化冲突分析

当Redis实例的CPU使用率突然飙升,而业务QPS并未出现明显增长时,问题往往指向两个隐蔽的”性能杀手”:频繁的key过期持久化冲突。许多运维人员在遇到CPU异常时,第一反应是排查慢查询或大Key,却忽略了Redis后台任务对CPU的消耗。本文将系统讲解Redis的过期策略与持久化机制如何导致CPU飙升,并提供一套完整的排查与优化方案。

一、Redis CPU飙升的典型症状

Redis CPU使用率异常升高时,通常伴随以下现象:

  • 服务响应延迟增加:P99延迟从毫秒级飙升至百毫秒级,甚至出现超时。
  • QPS并未显著增长:业务流量正常,但CPU使用率却持续偏高。
  • 命令执行变慢:即使执行简单的GET/SET命令,耗时也明显增加。
  • 主从复制延迟:从库与主库之间的数据同步延迟增大。

二、频繁key过期:CPU飙升的”隐形杀手”

1. Redis过期策略的工作原理

Redis采用定期删除+惰性删除的组合策略来处理过期key 。定期删除默认每隔100毫秒(由hz参数控制,默认10,即每秒执行10次)执行一次后台任务activeExpireCycle,从设置了过期时间的key中随机抽取20个进行检查,删除其中过期的key 。如果过期的key比例超过25%,则继续循环,直到比例低于25%或达到时间上限 。

2. 大量key同时过期引发CPU飙升

当大量key设置了相同的过期时间(如缓存雪崩场景),Redis会触发fast模式快速清理过期key 。fast模式最高每秒执行1000次(每1ms一次),每次执行时间不超过1毫秒 。虽然单次执行时间很短,但高频次的扫描和删除操作会消耗大量CPU资源,导致服务响应变慢。

典型场景:电商秒杀活动结束后,大量秒杀相关的key同时过期,Redis需要快速清理这些过期key,CPU使用率瞬间飙升。

3. 过期key堆积导致内存碎片

未及时清理的过期key会占用内存空间,导致内存碎片率上升 。当内存碎片率超过1.5时,Redis需要花费额外CPU资源进行内存管理,进一步加剧CPU消耗 。

三、持久化冲突:RDB与AOF的CPU竞争

1. RDB快照的CPU开销

Redis生成RDB快照时,会fork出一个子进程。fork操作本身就会消耗大量CPU资源,尤其是在内存占用较大的实例中 。此外,在RDB生成过程中,如果父进程持续有大量写入操作,会触发写时复制(Copy-on-Write)机制,导致额外的CPU和内存开销。

2. AOF重写的CPU消耗

AOF重写同样通过fork子进程完成,会在后台重写AOF日志文件,压缩日志体积。但AOF重写过程中,父进程需要持续将新的写入命令缓存到AOF重写缓冲区,并在重写完成后合并,这个过程也会消耗CPU资源 。

3. 过期key对持久化的影响

过期key的删除操作会被记录到AOF日志中,并同步到从库 。当大量key同时过期时,Redis会向AOF文件追加大量DEL命令,增加AOF文件体积和重写负担。同时,主库需要向从库发送DEL命令,导致主从复制链路压力增大 。

四、实战排查:定位CPU飙升的根因

1. 使用Redis INFO命令查看关键指标

redis-cli INFO stats | grep -E "expired_keys|evicted_keys"
redis-cli INFO memory | grep -E "used_memory|maxmemory|mem_fragmentation_ratio"
redis-cli INFO persistence | grep -E "rdb_bgsave_in_progress|aof_rewrite_in_progress"

重点关注以下指标:

  • expired_keys:每秒过期的key数量,若持续高于数千,说明存在大量key同时过期。
  • mem_fragmentation_ratio:内存碎片率,超过1.5说明碎片严重,可能影响CPU性能 。
  • rdb_bgsave_in_progress:RDB持久化状态,若频繁执行,说明持久化策略需调整。
  • aof_rewrite_in_progress:AOF重写状态,若频繁触发,说明写入量过大。

2. 使用Redis慢查询日志

redis-cli SLOWLOG GET 10

检查是否有大量DEL命令或EXPIRE命令出现在慢查询日志中,这可能是过期key删除操作导致的。

3. 使用top命令检查Redis进程

top -p $(pgrep redis-server)

观察Redis进程的CPU使用率,如果长时间高于80%,且us(用户态)占比高,说明是过期key清理或持久化操作导致的CPU消耗。

五、优化方案:从根源降低CPU消耗

1. 优化key过期策略

分散过期时间:避免为大量key设置相同的过期时间,加入随机偏移量:

# 设置过期时间为1小时±随机分钟数
SET key value EX $((3600 + RANDOM % 600))

调整hz参数:适当降低hz值,减少定期删除的执行频率。但注意,hz值过低会导致过期key清理不及时,内存占用增加。建议设置为5-10,需根据业务场景权衡 。

启用active-expire-effort:Redis 6.0+支持active-expire-effort参数,可以调整过期key清理的激进程度。默认值为1,设置为0可降低CPU消耗,但会增加过期key的堆积 。

2. 优化持久化策略

调整RDB快照频率:根据业务对数据丢失的容忍度,适当降低RDB快照频率。例如,将默认的save 900 1调整为save 3600 1

使用AOF rewrite触发阈值:避免频繁触发AOF重写,建议将auto-aof-rewrite-percentage设置为100,auto-aof-rewrite-min-size设置为64MB。

避免在高峰期做持久化:通过脚本在业务低峰期手动触发RDB快照或AOF重写。

3. 内存碎片整理

启用主动碎片整理功能,减少碎片对CPU的影响:

redis-cli CONFIG SET activedefrag yes

可配合调整以下参数控制CPU占用:

  • active-defrag-threshold-lower:碎片率超过10%时启动整理
  • active-defrag-cycle-min:CPU最低占用25%
  • active-defrag-cycle-max:CPU最高占用75%

4. 调整淘汰策略

若内存使用率持续偏高,应设置合理的淘汰策略,避免因内存不足触发频繁的淘汰操作:

redis-cli CONFIG SET maxmemory-policy allkeys-lru

推荐使用allkeys-lru策略,从所有key中淘汰最近最少使用的key,适用于大多数场景 。

六、总结:Redis CPU飙升排查标准流程

步骤 操作 关键命令/工具
第一步 查看CPU使用率 top -p $(pgrep redis-server)
第二步 检查过期key统计 redis-cli INFO stats | grep expired_keys
第三步 检查持久化状态 redis-cli INFO persistence
第四步 查看慢查询日志 redis-cli SLOWLOG GET 10
第五步 检查内存碎片率 redis-cli INFO memory | grep mem_fragmentation_ratio
第六步 针对性优化 调整过期时间、持久化策略、碎片整理

高性能服务器推荐:在排查Redis CPU飙升问题的同时,若你正在寻找一台稳定、高性能的物理服务器来承载Redis实例,推荐使用 TOP云金牌物理服务器,CPU可选双路E5-2698 V4(88核)至双路Platinum 8173(112核),内存最高128G,带宽独享20M-200M,价格低至368元/月。所有资源全网独享,无虚拟化开销,确保Redis实例在充足的硬件资源上高效运行,从根源上减少因CPU资源不足导致的性能瓶颈问题。

: What Are the Impacts of the Redis Expiration Algorithm? – Redis官方知识库
: Redis 核心机制:数据过期策略与淘汰策略深度解析 – CSDN博客
: Redis 内存被打满之后,我翻遍源码总结的这 7 条保命经验 – 博客园

阿, 信