第7章 Redis的噩梦:阻塞

Redis的单线程架构决定了其不能允许阻塞。

1. 发现阻塞

线上应用最先感知到阻塞,客户端会抛出异常,应用方应当收集异常。并保存异常的信息(哪个Redis节点,ip, port等)
借助Redis监控系统,如CacheCloud

2. 内在原因

2.1 API或数据结构使用不合理

避免在大对象上执行算法复杂度超过O(n)的命令。

  1. 发现慢查询:慢查询统计功能, slowlog get {n}
  2. 发现大对象: bigkeys,统计历史扫描过的最大对象

2.2 CPU饱和

Redis把单核CPU使用率跑到接近100%
比如过度使用ziplist压缩编码

2.3 持久化阻塞

持久化引起的阻塞操作主要有:fork阻塞,AOF刷盘阻塞,HugePage写操作阻塞

3. 外在原因

3.1 CPU竞争

  1. 进程竞争
  2. 绑定CPU(不适合开启持久化或参与复制的主节点,因为子进程会与父进程共享一个CPU)

3.2 内存交换

  1. 保证机器有充足的可用内存
  2. 确保所有Redis实例设置最大可用内存
  3. 降低系统使用swap优先级

3.3 网络问题

  1. 连接拒绝:网络闪断,超过最大连接,连接溢出(进程限制打开文件数,backlog队列溢出)
  2. 网络延迟:与容灾性相反
  3. 网卡软中断

你可能感兴趣的:(第7章 Redis的噩梦:阻塞)