avatar

一条在知识海洋的咸鱼

这个家伙很懒,啥也没有留下😋

  • 首页
  • Linux
  • OCJP
  • Java核心技术卷
  • J2EE相关标准
  • 深入理解Java虚拟机
  • NIO与SOcket编程技术指南
  • Java多线程编程核心技术
  • Redis开发与运维
  • Spring Cloud Alibaba 微服务原理与实践
  • DevOps
  • Docker
  • MySQL必知必会
  • AI自学路线
  • Spring Boot 编程思想(核心篇)
主页 Redis的噩梦:阻塞
文章

Redis的噩梦:阻塞

发表于 2021-01-12 更新于 2026-06- 10
作者 Administrator
8~11 分钟 阅读

Redis的所有读写操作都是在一条主线程中完成的,当Redis用于高并发场景时,非常重要。

  • 阻塞的原因有:
    1.内在原因:不合理使用数据结构和API、CPU饱和、持久化阻塞等
    2.外在原因:CPU、内存、网络
  • 发现阻塞
    • 应用内
    • 非应用内
  • 内在原因
    • API或数据结构使用不合理
      • 如何发现慢查询
      • 如何发现大对象
    • CPU饱和
    • 持久化阻塞
      • fork阻塞
      • AOF刷盘阻塞
      • HugePage写操作阻塞
  • 外在原因
    • CPU竞争
      • 进程竞争
      • 绑定CPU
      • 内存交换(swap)
    • 网络问题
      • 连接拒绝
      • 网络延迟
      • 网卡软中断

发现阻塞

应用内

Redis阻塞发生时,线上应用服务会最先感知到,这是应用方会受到大量Redis超时异常,应该在应用中加入异常统计并通过邮件/短信/微信报警,以便及时发现通知问题

调用Redis的API会分散在项目多个地方,全部监控代码会难以维护。可以用日志系统,当异常发生时,异常信息最终会被日志系统收集到日志文件,可以自定义日志文件专门统计异常和触发报警逻辑

非应用内

还可借助Redis监控系统发现阻塞问题,Redis相关的监控系统开源方案有很多,当系统检测到Redis运行起的一些关键指标出现不正常时触发报警。

内在原因

定位到具体的Redis节点异常后,应首先排查是否为Redis自身原因

  • 定位:
    1.API或数据结构使用不合理
    2.CPU饱和的问题
    3.持久化相关的阻塞

API或数据结构使用不合理

对于高并发场景应该尽量避免在大对象上执行算法复杂度超过O(n)的命令。

如何发现慢查询

Redis原生提供慢查询统计功能

  • slowlog get [n]:获得最近n条慢查询记录

如何发现大对象

Redis提供发现大对象的工具:redis-cli -h [ip] -p[port] bigkeys
image.png

CPU饱和

单线程的Redis处理命令时只能使用一个CPU,CPU饱和是指Redis把单核CPU使用率跑到接近100%。使用top命令可以查看
解决办法可以使用集群化水平扩展来分摊OPS压力

持久化阻塞

持久化阻塞的主要操作有:fork阻塞、AOF阻塞、HugePage写操作阻塞

fork阻塞

fork操作发生在RDB和AOF重写时,应避免使用过大内存实例和规避fork缓慢的操作系统

AOF刷盘阻塞

这种阻塞行为主要是硬盘压力引起,可能为Redis进程引起,也可能为其他进程引起

HugePage写操作阻塞

外在原因

  • 外部有:
    1.CPU竞争
    2.内存交换
    3.网络问题

CPU竞争

进程竞争

当其他进程过度消耗CPU时,将严重影响Redis吞吐量,可以通过top、sar等命令定位,可以调整服务之间部署结构

绑定CPU

部署Redis时为了充分利用多核CPU,通常一台机器部署多个CPU,并把Redis绑定到CPU上,降低CPU频繁切换上下文。但当Redis父进程创建子进程进行RDB/AOF重写时会产生激烈竞争,所以开启了持久化或主节点不建议绑定CPU

内存交换(swap)

内存交换对于Redis来说是非常致命的,Redis保证高性能的一个重要前提是所有的数据在内存中,如果使用硬盘速度差距很大
可使用如下命令查看
image.png
交换量为0或4KB为正常现场,说明Redis进程内存没有被交换

  • 预防被交换的方法:
    1.保证足够多的可用内存
    2.确保所有Redis实例设置最大可用内存,防止极端情况下Redis内存不可控增长
    3.降低系统使用swap优先级

网络问题

  • 主要为:
    1.拒绝连接
    2.网络延迟
    3.网卡软中断

连接拒绝

网络延迟

网卡软中断

Redis开发与运维
Redis
许可协议: 
分享

相关文章

1月 17, 2021

Redis监控运维云平台 CacheCloud

无论使用还是运维Redis,不要将其看作黑盒。当Redis达到了一定规模,这些命令会变得捉襟见肘,如果通过平台化的工具同意监控和管理将极大地提升开发和运维人员工作效率CacheCloud是什么现有问题部署成本实例碎片化监控、统计和管理不完善运维、经济成本CacheCloud功能主要功能快速部署Cac

1月 16, 2021

缓存设计

缓存能够有效地加速应用的读写速度,同时也可以降低后端负载,对日常用用的开发至关重要缓存的收益和成本缓存的收益缓存的成本缓存的使用场景缓存更新策略缓存的收益和成本缓存的收益加速度写因为缓存通常是全内存的(Redis、Memcache),存储层通常读写性能不够强悍(MySQL),通过缓存的使用可以有效地

1月 14, 2021

集群

Redis Cluster是Redis的分布式解决方案,有效地解决了Redis分布式方面的需求数据分布数据分布理论数据分布数据分布理论

下一篇

哨兵

上一篇

复制

最近更新

  • 55 异常兜底:工具失败、非法输出、空检索与超时
  • 54 Agent Memory:短期记忆、用户上下文与摘要
  • 53 Human-in-the-loop:让关键动作暂停、确认与恢复
  • 52 工单 Tool:字段校验、创建结果与失败补偿
  • 51 订单 Tool:Mock、鉴权、状态解析与脱敏

热门标签

java基础 微服务 maven Spring Tomcat DDD Linux Linux基础 SQL基础 数据结构算法

目录

©2026 一条在知识海洋的咸鱼. 保留部分权利。

使用 Halo 主题 Chirpy