记一次线上环境redis响应慢,导致雪崩

  • 前言
    redis是主从加哨兵架构,java服务放在k8s上,使用springboot的actuator来进行健康检查。

故障原因如下,redis因为cpu激增,导致响应慢,断开了和java的连接,正好在k8s健康检查的时间内,检查到java服务不正常,k8s干掉了java服务,导致业务不正常。

  • 解决思路
  1. 首先防止雪崩效应,避免雪球越滚越大,网络波动是我们避免不了的,我们也不能因为这个原因,去加大k8s检查间隙时间或者关闭k8s的健康检查,不能因为丢了西瓜去捡芝麻,所以更合适的解决办法是,springboot去做健康检查的时候,关闭掉对redis的检查,不要因为redis的问题,导致java服务雪崩。
management.health.redis.enabled=false

2.redis cpu激增检查,cpu飙高,我们要分情况来选择合适的方法排查,如果是一直很高,直接查看信息,可能线程死锁了等,如果是一会儿高,一会儿降低,火焰图更适合。

  1. 先检查redis的慢日志,slowlog get 5,如果有慢日志,使用keys和keys*的去匹配,我们要进行改正代码。推荐使用scan来代替keys
    记一次线上环境redis响应慢,导致雪崩
    4.如果优化了redis命令,cpu还是下不来,我们可以使用redis的官方建议,排查下,使用以下命令
latency doctor

结果如下

  • Deleting, expiring or evicting (because of maxmemory policy) large objects is a blocking operation. If you have very large objects that ar
    e often deleted, expired, or evicted, try to fragment those objects into multiple smaller objects.
  • I detected a non zero amount of anonymous huge pages used by your process. This creates very serious latency events in different condition
    s, especially when Redis is persisting on disk. To disable THP support use the command ‘echo never > /sys/kernel/mm/transparent_hugepage/ena
    bled’, make sure to also add it into /etc/rc.local so that the command will be executed again after a reboot. Note that even if you have alr
    eady disabled THP, you still need to restart the Redis process to get rid of the huge pages already created.

我们可以看到有大对象被删除,那怎么去找大对象呢,等下说。

THP需要关闭,什么是THP可以百度下,关闭它需要重启redis服务。

  • redis monitor redis官方提供monitor命令,可以监控在redis执行的所有命令,但是此命令会消耗redis的性能,所有要排除业务的高峰期使用
monitor > redis-monitor.txt
  • 火焰图
    使用 perf 采样
perf record -g --pid $(grep redis-server) -F 999 -- sleep 60

设置最小调用图包含阈值为 0.5%

perf report -g "graph,0.5,caller"

生成火焰图

git clone https://github.com/brendangregg/FlameGraph.git
perf script > redis.perf.stacks
stackcollapse-perf.pl redis.perf.stacks > redis.folded.stacks
flamegraph.pl redis.folded.stacks > redis.svg
上一篇:浅析 synchronized 底层


下一篇:Arrays.fill 数组填充工具类