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 阻塞原因的更多相关文章

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

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

  2. redis阻塞原因以及处理方案

    来源:https://blog.csdn.net/francis123580/article/details/82500700 Redis是单线程架构,在高并发的场景下,如果出现阻塞,会有严重后果,以 ...

  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. 需要我们了解的SQL Server阻塞原因与解决方法

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

  6. SQL Server 阻塞原因分析

    这里通过连接在sysprocesses里字段值的组合来分析阻塞源头,可以把阻塞分为以下5种常见的类型(见表).waittype,open_tran,status,都是sysprocesses里的值,“ ...

  7. Redis的Aof被阻塞原因调查

    背景 Redis是单进程的,为了发挥多核的优势,我们redis集群采用在单台机器上部署多个redis实例,同时对持久化方式做了改进,采用rdb和增量的aof相结合的方式,appendfsync配置为n ...

  8. SQL Server数据阻塞原因

    阻塞形成原因 是由于SQL Server是高并发的,同一时间会有很多用户访问,为了保证数据一致性和数据安全,引入了锁的机制.同一时间只有拿到钥匙的用户能够访问,而其他用户需要等待. 死锁形成四大必要条 ...

  9. Redis阻塞诊断基础

    slowlog Redis慢查询 slowlog 参数 slowlog-log-slower-than: 慢查询时间阈值,超过这个阈值的查询将会被记录,默认值10000,但是微妙,也即10毫秒. sl ...

随机推荐

  1. PriorityBlockingQueue

    public class PriorityBlockingQueueTest { /** * 有优先级顺序的阻塞队列,底层实现是数组,无边界.默认是11. * 构造方法可以传入一个比较器,不传的话,默 ...

  2. ACR122U读卡器在win7以上系统使用过程中的设置项

    发现ACR122U这个读卡器在进行nested破解的时候总是卡死,换了N个驱动程序都不行. 后发现是windows系统因智能卡的即插即用设置导致的问题,可以通过组策略的设置搞定. gpedit.msc ...

  3. Nginx 极简教程(快速入门)

    作者:dunwu github.com/dunwu/nginx-tutorial 推荐阅读(点击即可跳转阅读) 1. SpringBoot内容聚合 2. 面试题内容聚合 3. 设计模式内容聚合 4.  ...

  4. 2019-9-23-win10-uwp-睡眠唤醒

    原文:2019-9-23-win10-uwp-睡眠唤醒 title author date CreateTime categories win10 uwp 睡眠唤醒 lindexi 2019-9-23 ...

  5. C# - VS2019通过重写pictureBox实现简单的桌面截图功能

    前言 通过创建客制化组件(继承pictureBox),新增属性和构造方法,实现屏幕截图时需要用到的功能点.再通过监控鼠标按下.移动和释放,来获取起始点区域.最后通过操作BMP图像,实现截图的新增.修改 ...

  6. 在RPA中使用Python批量生成指定尺寸的缩略图!比Ps好用!

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 htt ...

  7. 配置git远程连接gitlab

    1.本地git下载 2.配置全局的用户名和邮箱,命令分别为 git config --global user.name "username" git config --global ...

  8. iOS音频与视频的开发(一)-使用AVAudioPlayer播放音乐、使用AVPlayerViewController播放视频

    iOS的多媒体支持非常强大,它提供了多套支持多媒体的API,无论是音频.视频的播放,还是录制,iOS都提供了多种API支持.借助于这些API的支持,iOS应用既可以查看.播放手机相册中的照片.视频,也 ...

  9. linux守护进程start-stop-daemon启动服务

    start-stop-daemon #! /bin/sh PATH=/sbin:/bin . /lib/lsb/init-functions do_start () { log_action_msg ...

  10. [b0031] python 归纳 (十六)_线程同步_锁

    # -*- coding: utf-8 -*- """ 学习 多线程同步 使用锁 threading.Lock() 逻辑: 2 个线程,操作同一个整型变量,一个加法,另外 ...