NOTE

3.4 Redis阻塞

1. 什么是Redis阻塞 - redis需要很长时间才能响应客户端请求 2. 为什么会发生阻塞 本质上是因为redis是单线程架构,命令执行在这个线程中完成 3. 如何发现阻塞 - 业务方的redis客户端连接redis服务器超时,触发监控告警 4. 原因分析 4.1. 内在 4.1.1. 使用了

Redis / Cache创建于 更新于 historical

这是历史学习笔记,可能存在过时或不完整的理解。

1. 什么是Redis阻塞

  • redis需要很长时间才能响应客户端请求

2. 为什么会发生阻塞

本质上是因为redis是单线程架构,命令执行在这个线程中完成

3. 如何发现阻塞

  • 业务方的redis客户端连接redis服务器超时,触发监控告警

4. 原因分析

4.1. 内在

4.1.1. 使用了复杂度较高的命令

  • 数据结构不合理
  • 原子命令数据量太大,比如mset 1W条数据
    • 如何解决:分批执行,不要求原子性的话可以使用pipeline

4.1.2. CPU饱和(单机性能瓶颈)

  • CPU饱和是指 Redis把单核CPU使用率跑到接近100%
  • 如何发现:
    • 使用top命令很容易识别出对应 Redis进程的CPU使用率
  • 如何解决:
    • 本质上是Redis单机性能瓶颈,那么需要使用redis-cluster模式分散压力

4.1.3. 持久化

  • 持久化有些操作回引起主线程阻塞:fork阻塞、AOF刷盘阻塞
  • fork阻塞
    • RDB和AOF重写时会fork一个子进程处理
    • 如何发现:info stats命令查看latest_fork_usec
    • 如何解决:避免使用过大的内存实例
  • AOF刷盘阻塞

4.2. 外在

4.2.1. CPU竞争

比如和其他服务部署在一定

4.2.2. 内存swap

/proc/sys/vm/swapness设置为1,既保留swap又降低使用

4.2.3. 网络问题

4.2.3.1. 连接拒绝
  • 网络闪断:比如网络切换或者带宽耗尽,可以使用sar定位
  • redis最大客户端连接数:redis配置文件
  • 连接溢出:比如Linux的进程fd数量限制
4.2.3.2. 网络延迟

取决于客户端到->服务端的网络环境