redis-性能调优 -- 调整HZ参数

1,425 阅读2分钟

HZ 参数解释

通过修改hz参数的值,您可以调整Redis执行定期任务的频率,从而改变Redis清除过期key、清理超时连接的效率。

Redis定期任务与hz参数的关系

为了定期检测资源和服务状态并根据预定策略执行相应的操作,Redis调用一个内部函数来执行多种后台任务,例如:

  • 计算LRU信息并清除过期key。
  • 关闭超时的客户端连接。
  • 整理hash类型的数据。
  • 执行RDB或AOF持久化相关操作。
  • 更新统计信息。

这些定期任务是Redis服务正常运行的保障,它们的执行频率由hz参数的值指定,默认为10,即每秒执行10次。

典型应用场景

Redis会通过执行定期任务来主动清除过期key,执行过程如下:

  1. 从设置了过期时间的key的集合中随机检查20个key。
  2. 删除检查中发现的所有过期key。
  3. 如果检查结果中25%以上的key已过期,则开始新一轮任务。

如果过期key数量很多或者增加速度很快,而Redis的主动清除频率较低,过期key将占用大量的内存空间,可能会影响Redis服务的性能。适当调整hz参数的值,提高清除频率,能够很好地解决这个问题。

取值范围及设置建议

hz的取值范围为1~500。增大hz参数的值会提升各项定期任务的执行频率,但也会提高Redis服务的CPU使用率。默认值10在一般情况下已经可以满足需求,如果业务场景对于某些定期任务的执行频率有很高的要求,您可以尝试在100以内调整参数值。将hz的值增加到100以上对CPU使用率有相对较大的影响,请谨慎操作。

定期任务的执行频率【HZ】为一个固定值时,容易产生以下问题:

  • 如果该值过小,在超时的客户端连接数较多或过期key较多等情况下,资源无法被及时整理回收,可能影响Redis服务的性能甚至导致服务崩溃。
  • 如果该值过大,定期任务将会消耗过多的CPU资源,同样可能影响Redis服务的稳定性

调整redis的HZ的脚本命令

#/bin/bash
redis_addr_str="****:6379,****:6380"

redis_addr_array=(${redis_addr_str//,/ })

for redis_addr_info in ${redis_addr_array[@]}
do
  redis_addr=(${redis_addr_info//:/ })
  addr=${redis_addr[0]}
  port=${redis_addr[1]}
  # 修改redis 的hz参数
  echo `redis-cli -h $addr -p $port  config set hz 30`
  # 将服务器当前所使用的配置记录到 redis.conf 文件中
  echo `redis-cli -h $addr -p $port  CONFIG REWRITE`
  # 获取当前HZ
  echo `redis-cli -h $addr -p $port  config get hz`
done

通过线上实战,可以看到修改hz为30之后,效果明显

image.png