客户端最先感知阻塞等Redis超时行为,应用方会收到大量Redis超时异常,比如Jedis客户端会抛出JedisConnectionException异常。加入日志监控报警工具可快速定位阻塞问题,同时需要对Redis进程和机器做全面监控。

导致阻塞问题的场景大致分为内在原因和外在原因:

1)内在原因包括:

1.1、数据集中过期

Redis的主动过期的定时任务,也是在Redis主线程中执行的,如果出现了需要大量删除过期key的情况,那么主线程会出现阻塞(最大25s)。而且这个访问延迟的情况,不会记录在慢日志里。

解决方案是,在集中过期时增加一个随机时间,把这些需要过期的key的时间打散即可。

1.1、不合理地使用API或数据结构

发现慢查询后,开发人员需要作出及时调整。可以按照以下两个方向去调整:

1)修改为低算法度的命令,如hgetall改为hmget等,禁用keys、sort等命 令。

2)调整大对象:缩减大对象数据或把大对象拆分为多个小对象,防止一次命令操作过多的数据。

1.2、CPU饱和

对于这种情况,首先判断当前Redis的并发量是否达到极限,建议使用统计命令redis-cli-h{ip}-p{port}--stat获取当前 Redis使用情况。对于并发量达到极限这种情况,我们需要做集群化水平扩展来分摊OPS压力。如果没有低并发就接近CPU饱和是很不正常的,有可能使用了高算法复杂度的命令。还有一种情况是过度的内存优化,需要我们根据infocommandstats统计信息分析出命令不合理开销时间(比如上万个元素却采用ziplist编码,虽然hash结构内存占用会变小,但是操作变得更慢且更消耗CPU)

1.3、持久化阻塞

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

HugePage写操作阻塞:子进程在执行重写期间利用Linux写时复制技术降低内存开销,因此只有写操作时Redis才复制要修改的内存页。对于开启Transparent HugePages的 操作系统,每次写命令引起的复制内存页单位由4K变为2MB,放大了512 倍,会拖慢写操作的执行时间,导致大量写操作慢查询。例如简单的incr命 令也会出现在慢查询中。

2)外在原因包括:

2.1、CPU竞争

进程竞争、绑定CPU(父子进程共用一个cpu,子进程占用过多CPU)

2.2、内存交换

内存交换(swap)对于Redis来说是非常致命的,Redis保证高性能的一 个重要前提是所有的数据在内存中。如果操作系统把Redis使用的部分内存 换出到硬盘,由于内存与硬盘读写速度差几个数量级,会导致发生交换后的 Redis性能急剧下降。

2.3、网络问题

可能有这三种情况:网络闪断、Redis连接拒绝、连接溢出。

Redis连接拒绝。Redis通过maxclients参数控制客户端最大 连接数,默认10000。

连接溢出。这是指操作系统或者Redis客户端在连接时的问题。这个问题的原因比较多,比如进程限制、 backlog队列溢出。

Redis阻塞的几种原因相关推荐

  1. 一文深入了解 Redis 内存模型,Redis 的快是有原因的!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:编程迷思 cnblogs.com/kismetv/p/865 ...

  2. redis 内存不足 排查_一文深入了解 Redis 内存模型,Redis 的快是有原因的!

    前言 一.Redis内存统计 二.Redis内存划分 1.数据 2.进程本身运行需要的内存 3.缓冲内存 4.内存碎片 三.Redis数据存储的细节 1.概述 2.jemalloc 3.redisOb ...

  3. Redis数据库及五种数据类型的常用命令详解

    一.理论部分 1.什么是redis Redis(Remote Dictionary Server ),是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value结 ...

  4. Redis入门总结(一):redis配置文件,五种数据结构,线程模型和持久化方式

    (尊重劳动成果,转载请注明出处:https://yangwenqiang.blog.csdn.net/article/details/90321396冷血之心的博客) 关注微信公众号(文强的技术小屋) ...

  5. Redis单线程还快的原因

    Redis单线程还快的原因 Redis Server是多线程的,Redis单线程指的是请求处理整个流程是单线程的! 单线程还快的原因 纯内存操作: Redis数据存储在内存中,速度很快. 非阻塞IO多 ...

  6. Redis常用的五种数据类型

    转载 [Redis]五种数据类型及其使用场景 https://blog.csdn.net/zzu_seu/article/details/106323114?spm=1001.2101.3001.66 ...

  7. linux开机直接进入win,安装ubuntu之后直接进入windows系统的一种原因

    安装ubuntu之后直接进入windows系统的一种原因 2020年08月23日 | 萬仟网网络运营 | 我要评论 因为实验要求,需要采用Linux环境,所以安装了Ubuntu系统,安装过程中自己分区 ...

  8. Redis持久化的两种方式

    文章目录 前言 一.Redis持久化机制 二.RDB 三.AOF 总结 前言 Redis是基于内存的缓存机制,假定Redis服务器中途突然出现故障,那内存的数据就会丢失.针对这个问题,Redis提供了 ...

  9. 多线程下 redis阻塞线程

    开了12个线程 程序只能跑8个结果  多线程一直没抛异常  说明可能是内部死循环了   仔细一查发现是redis阻塞了线程 原因是没有设置redis的最大连接数与等待时间  默认最大连接数为8 导致每 ...

最新文章

  1. VDI序曲二十三 制作OFFICE 2003应用程序虚拟化序列
  2. 传递结构体变量解决方案,资料整理一
  3. 中文URL是否有利于网站SEO
  4. 郑州学python_郑州Python基础知识点学习之内置类型
  5. win下安装elasticsearch(win_Elasticsearch)
  6. AES 加密256位 错误 java.security.InvalidKeyException: Illegal key size or default parameters
  7. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第10篇]RSA和强RSA问题有什么区别
  8. c 调用matlab.m文件,ubuntu系统下C++调用matlab程序的方法详解
  9. 21天Jmeter打卡Day17 后置处理器_JSON_正则表达式_边界提取器_完成删除场景模拟测试
  10. CentOS7中密码登录失败锁定设置
  11. Fix Bug的五个阶段
  12. 【数学建模】人口增长Leslie模型
  13. FreeRTOS 正点原子教程学习笔记
  14. 一个简单的HTML5后台登陆界面及登录实现
  15. ssm基于javaweb的医疗健康知识管理系统设计与实现毕业设计源码
  16. 玩吧接入流程(暂时记记)
  17. html5 文字滑动效果,jQuery滑动文字特效
  18. Graphviz 可视化图形软件(python)
  19. 生成树最小树形图 -- 朱刘算法详解
  20. ominipeek 发包_WildPackets的著名的抓包软件Omnipeek

热门文章

  1. n枚硬币中找到问题硬币
  2. 16.3 表格里显示自定义控件
  3. 前端开发学习之一------前端开发是什么以及我们要学什么
  4. csgo自建服务器打人机,csgo如何跟好友打人机 | 手游网游页游攻略大全
  5. 武汉计算机专业的学校,计算机专业有哪些武汉的三本学校
  6. 监控系统中的服务器,监控系统中服务器的作用
  7. kettle默认情况下把空字符串当作NULL处理
  8. macOS Big Sur 11.3中添加了Hello新的屏幕保护程序
  9. mysql slap_mysqlslap压力测试介绍
  10. 二维火 Android 云收银模块化架构实践