来源:https://blog.csdn.net/francis123580/article/details/82500700

Redis是单线程架构,在高并发的场景下,如果出现阻塞,会有严重后果,以下就是对阻塞问题的分析排查和解决

内在原因

API 或 数据结构 使用不合理

排查:

  1. 发现慢查询:执行 slowlog get {n}
  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. 调整网络拓扑结构,同物理机>同机架>跨机架>同机房>同城机房>异地机房

redis阻塞原因以及处理方案的更多相关文章

  1. Redis深入学习笔记(五)Redis阻塞原因

    在实际使用Redis中,有时会碰到客户端timeout异常,或者没有可用连接异常等等异常,总结大概有如下原因: 内部阻塞原因: 1)大对象存取. 2)Fork阻塞. 3)Aof刷盘阻塞(距离上次刷盘大 ...

  2. redis 阻塞原因

    1.内因: A.api或数据结构使用不合理: 如:对一个包含上万元素的hash结构执行hgetall操作,数据量大且命令复杂度O(n),必然阻塞 B.慢查询:前面有介绍 C.大对象: 执行./redi ...

  3. 7.Redis主线程阻塞原因

    7.Redis主线程阻塞原因7.1 发现阻塞7.2 内在原因7.2.1 API或数据结构使用不合理7.2.2 CPU饱和7.2.3 持久化阻塞7.3 外在原因7.3.1 CPU竞争7.3.2 内存交换 ...

  4. Redis学习五(Redis 阻塞的原因及其排查方向).

    一.慢查询 因为 Redis 是单线程的,大量的慢查询可能会导致 redis-server 阻塞,可以通过 slowlog get n 获取慢日志,查看详情情况. 二.bigkey 大对象 bigke ...

  5. redis集群主流架构方案分析

    Redis在互联网大数据平台有着广泛的应用,主要被用来缓存热点数据,避免海量请求压垮数据库,同时可以提升服务节点的响应速度和并发量.随着数据量的增多,由于redis是占用单台物理机或虚机的内存,内存资 ...

  6. Redis高可用集群方案——哨兵

    本篇文章版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文系列地址http://www.cnblogs.com/tdws/tag/NoSql/ 本人之前有篇文章,讲到了redis主从复制,读写分 ...

  7. 【Javascript】解决Ajax轮询造成的线程阻塞问题(过渡方案)

    一.背景 开发Web平台时,经常会需要定时向服务器轮询获取数据状态,并且通常不仅只开一个轮询,而是根据业务需要会产生数个轮询.这种情况下,性能低下的Ajax长轮询已经不能满足需求,频繁的访问还会造成线 ...

  8. 需要我们了解的SQL Server阻塞原因与解决方法

    需要我们了解的SQL Server阻塞原因与解决方法 上篇说SQL Server应用模式之OLTP系统性能分析.五种角度分析sql性能问题.本章依然是SQL性能 五种角度其一“阻塞与死锁” 这里通过连 ...

  9. Redis Cluster集群主从方案

    本文介绍一种通过Jedis和Cluster实现Redis集群(主从)的高可用方案,该方案需要使用Jedis2.8.0(推荐),Redis3.0及以上版本(强制). 附:Redis Cluster集群主 ...

随机推荐

  1. 结合JVM 浅谈Java 类加载器(Day_03)

    所谓错过,不是错了,而是过了. 什么是JAVA类加载? Class对象由JVM自动产生,每当一个类被加载时,JVM就自动为其生成一个Class对象,通过Class对象可以获得类的相关信息.将类信息读取 ...

  2. python使用多线程备份数据库

    前言:在日常服务器运维工作中,备份数据库是必不可少的,刚工作那会看到公司都是用shell脚本循环备份数据库,到现在自己学习python语言后,利用多进程多线程相关技术来实现并行备份数据库,充分利用服务 ...

  3. Steam游戏《Northgard(北境之地)》修改器制作

    日期:2021.06.07 博客期:181 星期一 [温馨提示]: 我现在把资源先放到开头,不想研究学习的就直接取用.如果修改器失效了,你们可以在博客园本页直接评论,也可以给我发邮件告诉我,就是不要到 ...

  4. 安全利器 — SELinux

    在 Linux 系统中一切皆文件,资源也属于某种文件.用户在访问文件的时候,系统对权限(读.写 .执行)进行检查.只要用户对文件有足够的权限,就可以任意操作资源.root 用户对所有资源拥有所有权限, ...

  5. vmware workstation linux虚拟机点击suspend会卡死

    vmware workstation linux虚拟机点击suspend会卡死, 现象如图, 我测过很多发行版都有这个问题 临时解决方案是关闭suspend功能 sudo systemctl mask ...

  6. [论文阅读笔记] Adversarial Mutual Information Learning for Network Embedding

    [论文阅读笔记] Adversarial Mutual Information Learning for Network Embedding 本文结构 解决问题 主要贡献 算法原理 实验结果 参考文献 ...

  7. UF_EVAL 曲线或边分析

    Open C UF_EVAL_ask_arc  圆形曲线或边分析,得到曲线或边的信息UF_EVAL_ask_ellipse  椭圆曲线或边分析,得到曲线或边的信息UF_EVAL_ask_hyperbo ...

  8. 一文带你.Net混合锁和lock语句

    本文主要讲解.Net基于Monitor.Enter和lock实现互斥锁 Monitor.Enter实现 相比前面的锁来说,混合锁的性能更高,任何引用类型的对象都可以做为锁对象,不需要事先创建指定类型的 ...

  9. oracle 11g查看alert日志方法

    一.第一种方法 1.切换到oracle用户 su - oracle 2.进入sqlplus窗口 sqlplus / as sysdba 3.执行sql命令,查看trace文件位置:background ...

  10. Spring Boot下的一种导出CSV文件的代码框架

    1.前言 ​ CSV,逗号分隔值(Comma-Separated Values),即为逗号分隔的文本文件.如果值中含有逗号.换行符.制表符(Tab).单引号及双引号,则需要用双引号括起来:如果值中包含 ...