高并发下redis的瓶颈分析

Redis集群架构设计:高并发场景下的性能优化实战 Redis集群架构旨在通过分片(Sharding)和复制(Replication)提高系统的可用性和扩展性。常见的Redis集群模式包括主从复制(Master-Slave)、哨兵模式(Sentinel)和Redis Cluster。主从复制:一个主节点负责写操作,多个从节点负责读操作,实现读写分离。哨兵模式:监控主从节点的状态,当主节点故障时,自动提升一个从节点为主节点,保证服务的高可用性。:自动将数据分片到多个节点,每个节点负责一部分数据,支持动态扩展和故障转移。 阅读详情

背景

最近接到一个项目,负责架构设计与实现,原本单位做了很多给外边的人使用的api,但是对外给别人用的时候,接口的链接是怎样就给别人怎样的,没有加密也没有做并发控制,接口程序所在的机器在哪儿,给别人的ip就是哪儿,而且没有一个平台来管理它们,我们很难知道这些接口的价值(哪个别人用得比较多,哪个比较少),这就是这个项目的由来


仅仅针对”监控“的这一需求,我们引入了redis作为中间层,首先我们完善了用户使用接口的注册流程,通过用户信息和地址,hash出一个key,这个key是对应着一个地址的,把这个(key - 地址)对存在了redis里面。其次是nginx,nginx在我们的项目里面的流程大概是这样:

1、用户注册之后获取到他的key,通过包含了key的跟原本的url完全不同的url来访问

2、nginx捕获到用户特殊的key,然后程序根据这个key从redis中取出目标地址,再由nginx代替用户访问真正的地址,继而返回。

(这个过程好处是很多的)

(1)、隐藏了真实的地址,程序可以在上游服务器之外的地方干预用户的访问,提高安全性,干预过程可以很复杂

(2)、获取用户的信息,并将其存回redis,上游服务器通过定时程序将存在redis中的日志持久化进oracle并删除,然后进一步分析和可视化


问题来了

这个项目还处于测试阶段,资源是一台window server 服务器,和centos6.5服务器,测试阶段10秒内大概有10万的并发量,刚部署上去的一两天还是没有问题的,接下来却出现了redis连接不上的情况。查看进程访问,会出现下面的情况。(window server 下)


出现很多FiN_WAIT_2的TCP链接。

分析

一、redis是使用单线程处理连接的,意味着它绝对会出现下面二所说的情况。

二、很明显这是由于nginx和redis之间有很多没有释放的资源造成的,查看这个TCP的状态FIN_WAIT_2,解释一下:

在HTTP应用中,存在一个问题,SERVER由于某种原因关闭连接,如KEEPALIVE的超时,这样,作为主动关闭的SERVER一方就会进入 FIN_WAIT2状态,但TCP/IP协议栈有个问题,FIN_WAIT2状态是没有超时的(不象TIME_WAIT状态),所以如果CLIENT不关闭,这个FIN_WAIT_2状态将保持到系统重新启动,越来越多的FIN_WAIT_2状态会致使内核crash。 

好吧,大学没有好好念书,下面是http连接的状态变化

客户端状态迁移

CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSEDb.

服务器状态迁移

CLOSED->LISTEN->SYN收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED

有缺陷的客户端与持久连接

有一些客户端在处理持久连接(akakeepalives)时存在问题。当连接空闲下来服务器关闭连接时(基于KeepAliveTimeout指令),

客户端的程序编制使它不发送FIN和ACK回服务器。这样就意味着这个连接 将停留在FIN_WAIT_2状态直到以下之一发生:

 客户端为同一个或者不同的站点打开新的连接,这样会使它在该个套接字上完全关闭以前的连接。

用户退出客户端程序,这样在一些(也许是大多数?)客户端上会使操作系统完全关闭连接。

FIN_WAIT_2超时,在那些具有FIN_WAIT_2状态超时设置的服务器上。

如果你够幸运,这样意味着那些有缺陷的客户端会完全关闭连接并释放你服务器的资源。

然而,有一些情况下套接字永远不会完全关闭,比如一个拨号客户端在关闭客户端程序之前从ISP断开。

此外,有的客户端有可能空置好几天不创建新连接,并且这样在好几天里保持着套接字的有效即使已经不再使用。这是浏览器或者操作系统的TCP实现的Bug。


  产生原因有: 
1、长连接并且当连接一直处于IDLE状态导致SERVERCLOSE时,CLIENT编程缺陷,没有向SERVER 发出FIN和ACK包 
2、APACHE1.1和APACHE1.2增加了linger_close()函数,前面的帖子有介绍,这个函数可能引起了这个问题(为什么我也不清楚)
  解决办法: 
1。对FIN_WAIT_2状态增加超时机制,这个特性在协议里没有体现,但在一些OS中已经实现 
如:LINUX、SOLARIS、FREEBSD、HP-UNIX、IRIX等 
2。不要用linger_close()编译 
3。用SO_LINGER代替,这个在某些系统中还能很好地处理 
4。增加用于存储网络连接状态的内存mbuf,以防止内核crash 
5。DISABLE KEEPALIVE 

针对这种情况,我们做了几次讨论,有些结论,分别是:

1、设置nginx与redis的连接池,keepalive的时间,分别设为10秒,5秒,但是结果还是一样

2、不用keepalive,即不使用连接池,即每次用完就close()掉,你可以看到连接少了,但是不使用连接池,意味着10秒内要打开关闭10万次,开销太大

3、redis集群,在原本集群的体系上添加redis的集群,这或许能解决问题,但是10秒内10万实际上并不多,这样做了或许是取巧,并没有找到问题

4、设置redis的idle(空闲)时间限制,结果一样。


解决方案:

实际上不算解决方案,因为放弃了redis的内存机制,而是使用nginx本身的内存技术。网上关于redis的优化大部分不适用,这个问题有待分析解决。



JMeter实战:秒杀系统高并发性能测试方案设计与瓶颈分析 高并发性能测试是评估系统在极端负载下稳定性的关键技术手段,其核心在于模拟真实流量模型并精准定位瓶颈。从原理上讲,性能测试通过模拟多用户并发请求,考察系统的吞吐量、响应时间和资源利用率等关键指标,从而验证架构设计的合理性与可靠性。在秒杀这类脉冲式流量场景中,性能测试的技术价值尤为突出,它不仅能提前暴露数据库锁竞争、缓存穿透等潜在风险,还能为容量规划与弹性伸缩提供数据支撑。应用场景广泛覆盖电商促销、票务抢购、金融交易等高并发业务。本文聚焦秒杀系统,深入探讨如何利用JMeter的线程组配置模拟真实用户行为,并结合 阅读详情

相关推荐

Codex驱动AEDT完成无线充电仿真——从双线圈建模到三维电磁场动画

本文介绍了一个利用Codex、PyAEDT和Ansys Electronics Desktop 2025 R2实现双线圈无线充电系统自动建模与仿真的案例。通过简化模型(平面线圈+铁氧体磁芯),完成了从参数化建模、电磁场求解到后处理的全流程自动化,获得了耦合系数(k=0.17)、三维电磁场分布及多周期动态可视化效果。研究发现:线圈间距对传输效率影响最大(10-30mm间距时效率从40.2%降至5.57%),横向偏移15mm会使效率下降35%,而磁芯厚度增加带来的效率提升有限(3→7mm仅提高1.67%)。该框

sjjsjjsjjsjjsjj的博客 446

redis性能测试及瓶颈分析调优

redis性能测试调优分析

qq_38571773的博客 3334

深入浅出DDR系列(二)--DDR工作原理

学习完了DDR的基本组成和硬件结构原理之后,从整体上了解了DDR的特性和静态图,包括原理、管脚图等。那么本章就要从动态的角度来分析时序结构,包括read/write的整个过程到数据返回发生了什么,其中包括以下内容 DDR是如何完成Read、Write 等的操作 DDR的基本命令 DDR的时序参数 DDR的性能分析 1. DRAM基本组成 对于DRAM,其主要由行和列组成,每一个bit中都是由类似右下图的类晶体管的结构组成,对于sdram的数据,可以通过控制column和row就可以访问sd

奇小葩 3万+

高并发服务遇 redis 瓶颈引发的事故

元旦期间订单业务线告知推送系统无法正常收发消息,作为推送系统维护者的我正外面潇洒,无法第一时间回去,直接让 ops 帮忙重启服务,一切好了起来,重启果然是个大杀器。由于推送系统本...

梦醒人间 1004

密码学实战:如何利用生日攻击破解哈希函数

本文深入探讨了生日攻击在密码学中的应用及其对哈希函数的威胁。通过分析生日悖论的数学原理,揭示了哈希函数在实际应用中的脆弱性,并提供了防御策略,如升级哈希算法、正确使用加盐技术等。文章结合实战案例,帮助开发者理解如何有效防范此类攻击,确保系统安全。

weixin_42530732的博客 192

YOLOv8独家原创改进:SPPF原创自研创新 | SPPF创新结构,重新设计全局平均池化层和全局最大池化层,增强全局视角信息和不同尺度大小的特征

SPPF_improve利用全局平均池化层和全局最大池化层,加入一些全局背景信息和边缘信息,从而获取全局视角信息并减轻不同尺度大小所带来的影响

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 4684

深度掌握Redis:5大难题解决方案、单线程优劣势、高并发快原因等

单线程的威力实际上非常强大,每核心效率也非常高,多线程自然是可以比单线程有更高的性能上限,但是在今天的计算环境中,即使是单机多线程的上限也往往不能满足需要了,需要进一步摸索的是多服务器集群化的方案,这些方案中多线程的技术照样是用不上的。4. 另外,数据结构也帮了不少忙,Redis全程使用hash结构,读取速度快,还有一些特殊的数据结构,对数据存储进行了优化,如压缩表,对短数据进行压缩存储,再如,跳表,使用有序的数据结构加快读取的速度。多路-指的是多个socket连接,复用-指的是复用一个线程。

jjc4261的博客 722

threejs中使用Reflector实现出倒影效果,并实现背景透明的效果(Reflector镜面背景透明, 倒影弱化)

在项目中遇到要实现倒影效果,threejs给我们提供了Reflector,可以轻松完成镜面效果,实现倒影。但背景不透明;并且反射出的倒影太亮了;网上没搜到解决方案, 自己修改了下源码实现了想要的效果,做个记录...

weixin_40856652的博客 5721

redis使用过程中遇到的瓶颈有哪些,怎样解决?

瓶颈 1)机器内存大小,因为redis的数据放在内存里,所以存放数据量的多少取决于内存的多少 2)Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。 3)单点故障 4)主从复制 解决办法 总结: 1.Master最好不要做任何持久化工作,包括内存快照和A...

qq_43154385的博客 1613

【WRF-Chem】预处理工具(Preprocessors)总结

预处理工具(Preprocessors)总结

WW、forever的博客 1179

Python爬虫实战:公共资源交易平台招标数据采集实战 - 从零构建企业情报系统(附CSV导出 + SQLite持久化存储)!

我长期专注 Python 爬虫工程化实战,主理专栏 👉 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 1288

Redis的性能瓶颈

转载自:https://www.cnblogs.com/qwangxiao/p/8535202.html 1.首先Redis为什么这么快? 1.基于内存,不会受到硬盘IO速度的限制 2.单线程,避免了多线程切换导致的CPU消耗,也不用考虑锁的问题,不存在加锁释放锁的操作,也不存在因死锁而导致的性能消耗 3.使用多路I/O复用模型,非阻塞IO  多路I/O复用模型是利用 select、po...

AAA821的专栏 1万+

基于深度学习的人脸识别考勤管理系统,采用YOLOv11和Dlib算法实现人脸识别和考勤签到,前台人脸识别和签到系统 + 后台人脸和考勤管理系统,全网独发

基于深度学习的口罩人脸识别的考勤管理系统,采用YOLOv11和Dlib算法实现人脸识别和考勤签到,前台人脸识别和签到系统 + 后台人脸和考勤管理系统,全网独发

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1825

零基础学习性能测试第八章:高并发-redis压测实操与瓶颈分析

used_memory_rss是used_memory的1.8倍。:QPS从8万降到2万,CPU满载。增加maxclients。以下是为零基础定制的。

u011537504的博客 1288

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

oracle redis高并发量,高并发下redis的瓶颈分析

背景最近接到一个项目,负责架构设计与实现,原本单位做了很多给外边的人使用的api,但是对外给别人用的时候,接口的链接是怎样就给别人怎样的,没有加密也没有做并发控制,接口程序所在的机器在哪儿,给别人的ip就是哪儿,而且没有一个平台来管理它们,我们很难知道这些接口的价值(哪个别人用得比较多,哪个比较少),这就是这个项目的由来仅仅针对”监控“的这一需求,我们引入了redis作为中间层,首先我们完善了用户...

weixin_36168972的博客 346

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Redis瓶颈和调优

Redis 性能优化是一个综合性的过程,涉及内存管理、数据过期与清理、慢查询优化、持久化设置、并发控制以及集群扩展等方面。针对不同瓶颈,采取不同的优化策略,能够有效提升 Redis 的响应能力与稳定性。通过合理配置过期策略、使用合适的数据结构、优化慢查询、利用 Redis 集群和负载均衡等手段,可以确保 Redis 在高负载和高并发的场景下,仍能保持高效运行。在使用 Redis 时,性能瓶颈可能会对系统的响应时间和吞吐量产生较大影响。以下是 Redis 常见的性能瓶颈分析及调优建议。

木子馋喵的知识杂货铺 1197

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【Redis主从架构】1. Redis如何支撑高并发

1. 【Redis主从架构】Redis如何支撑高并发 文章目录1. 【Redis主从架构】Redis如何支撑高并发1. 学习内容2. Redis高并发和系统的高并发有什么关系?2. Redis的瓶颈在哪呢?3. Redis如何支持高并发? 1. 学习内容 (1)Redis高并发和系统的高并发有什么关系? (2)Redis如何支撑高并发? 2. Redis高并发和系统的高并发有什么关系? 大型电商系统中,像商城首页,商品详情页,高峰时期,QPS可以到达10万,百万,甚至上千万,无论是单独靠数据库还是Red

【程序员不弃】的博客 288

Redis重点四:保证redis高并发以及高可用一

1、redis高并发跟整个系统的高并发之间的关系 redis,你要搞高并发的话,不可避免,要把底层的缓存搞得很好 mysql,高并发,做到了,那么也是通过一系列复杂的分库分表,订单系统,事务要求的,QPS到几万,比较高了 要做一些电商的商品详情页,真正的超高并发,QPS上十万,甚至是百万,一秒钟百万的请求量 光是redis是不够的,但是redis是整个大型的缓存架构中,支撑高并发的架构里...

qq_41864967的博客 279

突破Redis性能瓶颈:redis-py高并发场景终极压测指南

你是否遇到过Redis服务在高并发下响应延迟飙升?是否想知道如何精准模拟生产环境流量进行性能验证?本文将带你深入redis-py的性能测试框架,通过实战案例掌握高并发场景下的性能压测方法,让你的Redis应用轻松应对流量峰值。 ## 压测工具框架解析 redis-py提供了完善的性能测试模块,位于[benchmarks/](https://link.gitcode.com/i/30a7cd20...

gitblog_00037的博客 1186

零基础学习性能测试第八章:高并发-redis缓存架构介绍

通过本指南,零基础学员可在2周内系统掌握Redis在高并发系统中的核心应用,建议在本地搭建环境完成3次秒杀系统模拟实验(从架构设计到压测优化),即可胜任企业级缓存开发工作。:某商品Key每秒访问10万次 → Redis单线程阻塞。:恶意请求不存在的数据(如查询ID=-1):大量Key同时过期 → 数据库被打垮。以下是为零基础学习者设计的。Redis是否存在?

u011537504的博客 959

高并发压测第3小时:面试官质疑系统架构,应届生用JMH验证性能瓶颈

在高并发压测的第3小时,面试官质疑应届生设计的秒杀系统架构,导致QPS从2000飙升至10万时性能崩溃。面对质疑,应届生沉着冷静,现场用JMH硬刚性能质疑,通过精准的性能测试数据,解释了系统瓶颈的根源,并提出优化方案。

Ared 1016

PHP会话存储性能瓶颈怎么破?Redis与Memcached对比实测(附代码)

解决PHP会话管理性能瓶颈,实测Redis与Memcached在高并发场景下的存储表现。对比响应速度、内存占用及稳定性,提供完整配置代码。提升会话处理效率的优选方案,值得收藏。

BreakNexus的博客 1001

深入理解 Redis 批量操作和事务机制:从原理到 Spring Data Redis 实践

Bean// 配置其他必要的属性,例如序列化器在 Spring Data Redis 中使用批量操作和事务时,必须了解 Redis 事务的局限性,特别是没有自动回滚机制。在高并发场景下,使用 Lettuce 作为 Redis 客户端,可以更高效地执行批量操作,避免单线程瓶颈。通过正确配置和使用 RedisTemplate,可以高效地执行 Redis 操作,并确保数据的一致性和性能。希望这篇文章能帮助你更好地理解和使用 Redis 的批量操作和事务,提高系统的性能和稳定性。

Evan 1551

【高并发场景下的PHP Session优化】:Redis存储实战与性能对比数据

解决高并发下PHP Session性能瓶颈,本文提供Redis存储的PHP Session 示例,涵盖配置方法、实战场景与性能对比数据,提升响应速度与系统稳定性,值得收藏。

ProceGlow的博客 848

为什么 Laravel 队列使用 database 驱动在高并发下性能极差?Redis 或 Beanstalkd 好在哪?

场景推荐驱动理由开发、测试、微小项目database简单,无需额外依赖,足以应付低频任务。中小型生产环境、已有Redisredis性能巨大提升,复用现有设施,是最平衡和常见的选择。高并发、大规模、任务关键型redis或beanstalkd需要极致的队列性能和可靠性。Beanstalkd是专门化的利器,Redis是多功能的全才。结论Database队列驱动的性能瓶颈根植于关系型数据库的ACID特性和磁盘I/O,这与消息队列所需的高吞吐、低延迟、无锁并发的本质需求相悖。

长风破浪会有时的博客 1212
上一篇: nginx 的负载均衡
下一篇: 使用C语言扩展lua语言功能
sword_csdn
博客等级 码龄11年 819粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值