Redis命令执行慢原因分析与解决方案

举报
FI小粉丝 发表于 2021/11/27 17:24:48 2021/11/27
【摘要】 问题背景与现象Redis客户端执行命令时间比较慢,超出预期。原因分析客户端与服务端网络延时比较长。客户端与服务端之间以及Redis实例之间网络带宽过载。Redis数据节点上运行了其他耗CPU比较高的服务。客户端连接池配置不合理。Redis中使用了keys * 等全库扫描的命令。Redis数据库里面存在大key,大value。Redis的key存在集中过期或者删除大量key的情况。Redis最...

问题背景与现象

Redis客户端执行命令时间比较慢,超出预期。

原因分析

  1. 客户端与服务端网络延时比较长。
  2. 客户端与服务端之间以及Redis实例之间网络带宽过载。
  3. Redis数据节点上运行了其他耗CPU比较高的服务。
  4. 客户端连接池配置不合理。
  5. Redis中使用了keys * 等全库扫描的命令。
  6. Redis数据库里面存在大key,大value。
  7. Redis的key存在集中过期或者删除大量key的情况。
  8. Redis最大内存配置超过10G,并且使用率超过10G。
  9. Redis内存使用率接近100%。
  10. Redis开启了AOF持久化(默认不开启)。

解决办法

  • 可能原因一:

    客户端与服务端网络延时比较长。

    排查/解决思路:

    长ping检查客户端与服务端之间的,响应时间越小越好。

  • 可能原因二

    客户端与服务端之间以及Redis实例之间网络带宽过载。

    排查/解决思路:

    1. 访问Redis前对数据进行压缩。
    2. 增大带宽。
  • 可能原因三:

    Redis数据节点上运行了其他耗CPU比较高的服务。

    排查/解决思路:

    建议Redis单独部署,不要和其他服务混合部署到一台服务器上面。

  • 可能原因四:

    Redis最大内存配置超过10G,并且使用率超过10G。

    排查/解决思路:

    Redis最大内存不应超过10G,超过10G时建议进行扩容。

  • 可能原因五:

    Redis开启了AOF持久化(默认不开启)

    排查/解决思路:

    建议默认不开启aof持久化。

  • 可能原因六:

    Redis内存使用率接近100%

    排查/解决思路:

    建议扩容。

  • 可能原因七:

    客户端连接池配置不合理。

    排查/解决思路:

    Redis客户端会使用连接池方式缓存Redis连接,当连接池配置不合理的时候,会导致客户端连接时获取不到足够的连接资源而等待,导致查询慢的现象。

    主要涉及的连接池配置如下表所示,可通过qps等进行简单评估。

    参数名

    含义

    默认值

    使用建议

    maxTotal

    连接池中最大连接数

    8

    最大连接数 > (Redis qps峰值) / 单条命令耗时

    maxIdle

    连接池中允许最大空闲的连接数

    8

    建议和maxTotal保持一致

    minIdle

    连接池中确保最少空闲的连接数

    0

    最少连接池 = (Redis qps 平均值) / 单条命令耗时

    timeout

    连接和读写超时时间

    -1,不超时

    建议:1000 – 5000 ,可根据业务具体调整,不建议取默认值

    blockWhenExhausted

    当连接池耗尽后,调用者是否需要等待

    true

    建议使用默认值

    maxWaitMillis

    当连接池耗尽后,调用者的最大等待时间,单位是毫秒,只有参数blockWhenExhausted设置为true,此参数才会生效

    -1,用不超时

    建议:1000 – 5000,具体可根据业务调整,当发现报错时,建议调整maxTotal和maxIdle

    numTestsPerEvictionRun

    做空闲资源检测时,每次的采样数

    3

    可根据自身应用连接数进行微调,设置为-1,对所有连接做空闲检测,JedisPoolConfig中的配置为-1

  • 可能原因八:

    Redis中使用了keys * 等全库扫描的命令。

    排查/解决思路:

    Redis 使用全库扫描的命令会导致Redis查询慢的现象。全库扫描的命令如下表所示:

    命令

    含义

    代替命令

    KEYS *

    列出当前实例里面所有的key

    scan、sscan、hscan、zscan

    FLUSHALL

    删除当前实例所有key

    /

    FLUSHDB

    删除当前实例对应db的key

    /

  • 可能原因九:

    Redis数据库里面存在大key,大value。

    排查/解决思路:

    可使用redis-cli -h 10.244.225.243 -p 22400 –memkeys或者redis-cli -h 10.244.225.243 -p 22400 –bigkeys查询当前实例中占用内存超大的key以及占用大小。可根据具体业务进行整改。

  • 可能原因十:

    Redis的key存储集中过期或者删除大量key的情况。

    排查思路:

    查看Redis逻辑集群监控中集群过期和淘汰键的监控,如果图表上升的比较快或者存在骤变的情况,则可能存在key集中过期或者删除key的现象。

    解决思路:

    1. 集中过期 key 增加一个随机过期时间,把集中过期的时间打散,降低 Redis 清理过期 key 的压力。 下图为过期时间点之后的5分钟内随机过滤掉。

    1. 检查参数lazyfree-lazy-expire是否配置为:yes(默认为yes),如果不是yes,则将其改为yes。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200