redis阻塞原因以及处理⽅案
Redis是单线程架构,在⾼并发的场景下,如果出现阻塞,会有严重后果,以下就是对阻塞问题的分析排查和解决
内在原因
API 或数据结构使⽤不合理
排查:
1. 发现慢查询:执⾏slowlog get {n}
redis支持的数据结构2. 发现⼤对象:执⾏redis-cli -h {ip} -p {port} --bigkeys
解决:
1. 解决慢查询:调整命令为低算法度命令
2. 调整⼤对象:把⼤对象拆分为多个⼩对象,防⽌⼀次命令操作过多数据
CPU饱和
排查
1. 查看CPU使⽤率:执⾏top命令
2. 查询Redis并发量:执⾏redis-cli -h {ip} -p {port} --stat命令
解决:
1. 集化⽔平拓展分摊OPS压⼒
2. 检查是否有过度的内存优化
持久化阻塞
排查
1. 检查最近fork操作耗时:执⾏info status获取到 latest_fork_usec 指标
2. 检查AOF刷盘最近成功时间:查看⽇志
解决:
1. 若fork操作耗时超过1秒,避免使⽤过⼤的内存实例和规避fork缓慢的操作系统
2. 若AOF刷盘fsync成功操作超过2秒,降低其他进程对硬盘的压⼒
外在原因
CPU竞争
排查:执⾏top或sar命令
解决:
不建议和其他多核CPU密集型服务部署在⼀起,会影响Redis吞吐量
把Redis进程绑定到CPU上,可降低CPU上下⽂切换开销
开启了持久化或参与复制的主节点不建议绑定CPU,因为⼦进程会占⽤90%竞争
内存交换
排查:
1. 查询Redis进程号:执⾏redis-cli -p 6383 info server | grep process_id命令
2. 根据进程号查询内存交换信息:执⾏cat /proc/process_id/smaps | grep Swap
解决:
1. 保证机器充⾜的可⽤内存
2. 确保所有Redis实例设置最⼤可⽤内存,防⽌Redis不可控增长
3. 降低系统使⽤swap优先级
⽹络问题
排查:
1. ⽹络闪断:通过sar -n DEV查看本机历史流量是否正常
2. Redis连接拒绝:执⾏redis-cli -p 6384 info stats | grep rejected_connections查看所有被拒绝的连接数量
3. 连接溢出:执⾏ulimit -n命令,检查操作系统对进程使⽤资源的限制;执⾏netstat -s | grep overflowed命令,检查是否有持续增长的连接拒
绝
4. ⽹络延迟:执⾏redis-cli -h {host} -p {port} --latency命令,测量机器之间的⽹络延迟
解决:
1. 避免客户端与Redis之间异地跨机房调⽤
2. 客户端访问Redis时尽量采⽤NIO长连接或者连接池的⽅式
3. 对于⽀撑⼤量连接的Redis需要增⼤ ulimit 值,修改系统backlog值
4. 调整⽹络拓扑结构,同物理机>同机架>跨机架>同机房>同城机房>异地机房
5.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论