redis 阻塞原因
1.内因:
A.api或数据结构使用不合理: 如:对一个包含上万元素的hash结构执行hgetall操作,数据量大且命令复杂度O(n),必然阻塞
B.慢查询:前面有介绍
C.大对象:
执行./redis-cli -h {ip} -p {port} --bigkeys命令可找出当前最大对象出来,接着便可对大对象进行调整或缩减或分成多个小对象
生产环境可执行debug object key查看key对应value序列化后的长度,或strlen key查看key的字节数
主动检测大对象:scan + debug object key命令
可使用info commandstats命令分析命令不合理的开销时间,会返回最近执行命令的调用次数、耗时等信息
D.CPU饱和:redis单线程只能使用一个CPU,饱和将无法处理更多命令 可以执行命令redis-cli -h {ip} -p {port} --stat获取当前redis使用情况
E.持久化相关阻塞:
a.fork阻塞: fork操作发生在rdb和aof重写时,redis主线程调用fork操作产生共享内存的子进程,由子进程完成持久化文件重写工作,若fork操作本身耗时过长,则必会导致主线程阻塞;可执行info stats命令获取到latest_fork_usec指标,表示redis最近一次fork操作耗时,若超过1s,则需要做出优化调整
b.aof刷盘阻塞: 当开启aof持久化功能时,文件刷盘的方式一般采用每秒一次,后台线程每秒对aof文件做fsync操作,硬盘压力过大时,fsync操作需要等待,直到写入完成如果主线程发现距离上一次的fsync成功超过2秒,为了数据安全性它会阻塞直到后台线程执行fsync操作完成,这种阻塞行为主要是硬盘压力引起,可查看Redis日志识别出这种情况,当发生这种阻塞行为时,会打印如下日志:
亦可查看info persistence统计中的aof_delayed_fsync指标,每次发生aof刷盘阻塞主线程时会累加
c.HugePage写操作阻塞(求大佬指教): 子进程在执行重写期间利用Linux写时复制技术降低内存开销,因此只有写操作时Redis才复制要修改的内存页,对于开启Transparent HugePages的操作系统,每次写命令引起的复制内存页单位由4K变为2MB,放大了512倍,会拖慢写操作的执行时间,导致大量写操作慢查询
2.外因:
A.CPU竞争:
a.进程竞争:当redis与其他cpu密集型服务部署在一起时可能发生
b.绑定cpu:由于redis单线程架构,为充分利用多核cpu,一台机器部署多个redis并将redis进程绑定到cpu(可降低cpu上下文切换开销),当redis父进程fork操作创建子进程进行rdb/aof重写(很耗cpu)时,父子进程共享同一cpu,将影响redis的稳定性
B.内存交换:指操作系统把redis使用的部分内存换出到硬盘,导致交换后redis性能急剧下降(内存与硬盘处理速度不在一个数量级),可如下查看内存交换信息获取redis进程号→cat /proc/进程号/smaps | grep Swap
C.网络问题:
1)连接拒绝:
a).网络闪段:网络割接或者带宽耗尽
b).连接拒绝:超过客户端最大连接数
c).连接溢出:指操作系统或redis客户端在连接时的问题,2种原因:
原因1:进程限制 操作系统会对进程使用的资源做限制,其中之一便是对可打开最大文件数进行控制,ulimit –n可查看,超过则发送too many open files错误
原因2:backlog队列溢出 系统对于特定端口的tcp连接使用backlog队列保存,redis默认长度为511,通过tcp-backlog参数设置,高并发场景下可增大该值,但必须大于操作系统允许值才生效,系统默认backlog为128,使用echo511>/proc/sys/net/core/somaxconn命令进行修改,可通过netstat -s命令获取因队列溢出造成的连接拒绝统计
2)网络延迟: 可使用redis提供的测试工具进行测试,在redis-cli -h {ip} -p {port}命令后加入参数进行测试:
--latency:持续进行延迟测试,分别统计:最小值、最大值、平均值、采样次数
--latency-history:统计结果同—latency,但默认每15秒完成一行统计,可通过-i参数控制采样时间
--latency-dist:使用统计图的形式展示延迟统计,每1秒采样一次
3)网卡软中断(求大佬指教):
网卡软中断是指由于单个网卡队列只能使用一个CPU,高并发下网卡数据交互都集中在同一个CPU,导致无法充分利用多核CPU的情况,网卡软中断瓶颈一般出现在网络高流量吞吐的场景
redis 阻塞原因的更多相关文章
- Redis深入学习笔记(五)Redis阻塞原因
在实际使用Redis中,有时会碰到客户端timeout异常,或者没有可用连接异常等等异常,总结大概有如下原因: 内部阻塞原因: 1)大对象存取. 2)Fork阻塞. 3)Aof刷盘阻塞(距离上次刷盘大 ...
- redis阻塞原因以及处理方案
来源:https://blog.csdn.net/francis123580/article/details/82500700 Redis是单线程架构,在高并发的场景下,如果出现阻塞,会有严重后果,以 ...
- 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 内存交换 ...
- Redis学习五(Redis 阻塞的原因及其排查方向).
一.慢查询 因为 Redis 是单线程的,大量的慢查询可能会导致 redis-server 阻塞,可以通过 slowlog get n 获取慢日志,查看详情情况. 二.bigkey 大对象 bigke ...
- 需要我们了解的SQL Server阻塞原因与解决方法
需要我们了解的SQL Server阻塞原因与解决方法 上篇说SQL Server应用模式之OLTP系统性能分析.五种角度分析sql性能问题.本章依然是SQL性能 五种角度其一“阻塞与死锁” 这里通过连 ...
- SQL Server 阻塞原因分析
这里通过连接在sysprocesses里字段值的组合来分析阻塞源头,可以把阻塞分为以下5种常见的类型(见表).waittype,open_tran,status,都是sysprocesses里的值,“ ...
- Redis的Aof被阻塞原因调查
背景 Redis是单进程的,为了发挥多核的优势,我们redis集群采用在单台机器上部署多个redis实例,同时对持久化方式做了改进,采用rdb和增量的aof相结合的方式,appendfsync配置为n ...
- SQL Server数据阻塞原因
阻塞形成原因 是由于SQL Server是高并发的,同一时间会有很多用户访问,为了保证数据一致性和数据安全,引入了锁的机制.同一时间只有拿到钥匙的用户能够访问,而其他用户需要等待. 死锁形成四大必要条 ...
- Redis阻塞诊断基础
slowlog Redis慢查询 slowlog 参数 slowlog-log-slower-than: 慢查询时间阈值,超过这个阈值的查询将会被记录,默认值10000,但是微妙,也即10毫秒. sl ...
随机推荐
- 多线程通信的两种方式? (可重入锁ReentrantLock和Object)
(一)Java中线程协作的最常见的两种方式: (1)利用Object的wait().notify()和notifyAll()方法及synchronized (2)使用Condition.Reentra ...
- C# System.Timers Demo
static void Main(string[] args) { SystemTimersDemo(); Console.ReadLine(); } static void SystemTimers ...
- SPA项目开发登陆注册
使用vue-cli脚手架工具创建一个vue项目 vue init webpack pro01 npm安装elementUI cd pro01 #进入新建项目的根目录 安装: npm install a ...
- 怎样深入学习php,成为php高手!?
本文章开头我想问一句话:PHP是做什么的? 因为这是面试中会问到的一个问题,虽然它看起来很简单,回答做网站的,也就是个简单建站的水平.回答做网站后端开发的,对PHP有了一定的认识,回答做后端处理的,有 ...
- 100款机械CAD图纸,想要出图快,勤练是最有效的方式之一!
提升CAD出图效率最有效的方式就是勤加练习,所以跟着小匠每天练习3个,30天把这100个常用的CAD机械图纸练完,再看你的出图效率!贵在坚持! 100个机械CAD图纸,请收好
- SpringBoot(三) 配置文件 篇章
SpringBoot 配置文件默认为application.properties,但是本章节主要讲解yaml文件配置,因为现在的趋势是使用yaml,它是类似于标准通用标记语言的子集XML的数据描述语言 ...
- Element-ui中ElScrollBar组件滚动条的使用
在翻看 element-ui官网的文档时,发现其左侧导航和右边的内容超出屏幕时,滚动条的样式比较小巧,通过浏览器审查工具查看,发现它是使用了el-scrollbar的样式,跟element-ui的组件 ...
- Python的日志功能
python自带的logging是日志处理模块,可以记录日志,并输出到控制台和文件等.日志分5个级别:DEBUG:调试信息,权重10INFO:一般信息,权重20WARNING:警告信息,权重30ERR ...
- Python—函数的参数传递
形参和实参 形参即形式参数,函数完成其工作时所需的信息.形参不占用内存空间,只有在被调用时才会占用内存空间,调用完了即被释放. 实参即实际参数,调用函数时传给函数的信息. # -*- coding: ...
- nginx的共享字典项api(操作方法)
nginx的共享内存,称为共享字典项,对于所有的worker进程都可见,是一种全局变量. 备注一下内容中的 [] 是 备注. 源码分析文档:https://www.codercto.com/a/948 ...