Redis的单线程架构决定了其不能允许阻塞。
1. 发现阻塞
线上应用最先感知到阻塞,客户端会抛出异常,应用方应当收集异常。并保存异常的信息(哪个Redis节点,ip, port等)
借助Redis监控系统,如CacheCloud
2. 内在原因
2.1 API或数据结构使用不合理
避免在大对象上执行算法复杂度超过O(n)的命令。
- 发现慢查询:慢查询统计功能, slowlog get {n}
- 发现大对象: bigkeys,统计历史扫描过的最大对象
2.2 CPU饱和
Redis把单核CPU使用率跑到接近100%
比如过度使用ziplist压缩编码
2.3 持久化阻塞
持久化引起的阻塞操作主要有:fork阻塞,AOF刷盘阻塞,HugePage写操作阻塞
3. 外在原因
3.1 CPU竞争
- 进程竞争
- 绑定CPU(不适合开启持久化或参与复制的主节点,因为子进程会与父进程共享一个CPU)
3.2 内存交换
- 保证机器有充足的可用内存
- 确保所有Redis实例设置最大可用内存
- 降低系统使用swap优先级
3.3 网络问题
- 连接拒绝:网络闪断,超过最大连接,连接溢出(进程限制打开文件数,backlog队列溢出)
- 网络延迟:与容灾性相反
- 网卡软中断
网友评论