文档首页/ 分布式缓存服务 DCS/ 用户指南(吉隆坡区域)/ 故障排除/ Redis实例内存使用率高问题排查和解决
更新时间:2024-07-29 GMT+08:00

Redis实例内存使用率高问题排查和解决

问题现象

Redis可提供高效的数据库服务,当内存不足时,可能导致Key频繁被逐出、响应时间上升、QPS(每秒访问次数)不稳定等问题,进而影响业务运行。由于Redis自身运行机制(主从同步、延迟释放等),内存占用率可能出现略微超过100%的情况,此为正常情况,此时内存已经写满,用户需要考虑扩容,或者清理一些无用的数据。通常情况下,当内存使用率超过95%时需要及时关注。

排查原因

  1. 查询指定时段的内存使用率信息,具体操作请参见查看监控指标。“内存利用率”指标持续接近100%。
  2. 查询内存使用率超过95%的时间段内,“已逐出的键数量”和“命令最大时延”,均呈现显著上升趋势,表明存在内存不足的问题。

    建议客户登录控制台,参考缓存分析查询Redis实例慢查询,执行大Key扫描和慢查询。如果实例没有设置过期时间,会导致存储数据太多,内存被占满。

  3. Redis实例如果内存满了但是key不多,可能原因是客户端缓冲区(output buffer)占用过多的内存空间。

    可以在Redis-cli客户端连接实例后,执行大key扫描命令:redis-cli --bigkeys,然后执行info,查看output buffer占用情况。

处理措施

  • 查找大key、热key,方法如下:
    • DCS控制台提供了大Key和热Key的分析功能,你可参考缓存分析减少大key和热key。
    • 通过redis-cli的bigkeys和hotkeys参数查找大Key和热Key:
      • Redis-cli提供了bigkeys参数,能够使redis-cli以遍历的方式分析Redis实例中的所有Key,并返回Key的整体统计信息与每个数据类型中Top1的大Key,bigkeys仅能分析并输入六种数据类型(STRING、LIST、HASH、SET、ZSET、STREAM),命令示例为:redis-cli -h <实例的连接地址> -p <端口> -a <密码> --bigkeys
      • 自Redis 4.0版本起,redis-cli提供了hotkeys参数,可以快速帮您找出业务中的热Key,该命令需要在业务实际运行期间执行,以统计运行期间的热Key。命令示例为:redis-cli -h <实例的连接地址> -p <端口> -a <密码> --hotkeys。热Key的详情可以在结果中的summary部分获取到。
  • 提前发现大key、热key。
    • 参考配置告警配置节点级别的内存利用率监控指标的告警。

      如果某个节点存在大key,这个节点比其他节点内存使用率高很多,会触发告警,便于您发现潜在的大key。

    • 参考配置告警配置节点级别的入网最大带宽、出网最大带宽CPU利用率监控指标的告警。

      如果某个节点存在热key,这个节点的带宽占用、CPU利用率都比其他节点高,该节点会容易触发告警,便于您发现潜在热key。

      由于Redis 3.0实例不支持热key分析,您可以使用该方式帮助您发现热key。

  • 其他优化建议:
    • string类型控制在10KB以内,hash、list、set、zset元素尽量不超过5000
    • key的命名前缀为业务缩写,禁止包含特殊字符(比如空格、换行、单双引号以及其他转义字符)。
    • Redis事务功能较弱,不建议过多使用。
    • 短连接性能差,推荐使用带有连接池的客户端。
    • 如果只是用于数据缓存,容忍数据丢失,建议关闭持久化。
  • 如果实例内存使用率通过以上方式仍然很高,请考虑在业务低峰期扩大实例规格。具体操作请参见变更实例规格