高并发下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的线程组配置模拟真实用户行为,并结合 阅读详情

相关推荐

MTK-AWB 小结 (二)

调试总结:可以将offset 对应的ratio加大,保留更多的喜好色(偏色),影响WF statistic gain,从而影响最终的awb gain。这一部分前期CCT校准的时候就会算出一组默认值,当然这个offset offse 值用于优化T,S,wf 光下的偏色喜好度. offset。后面遇到 A H Shad 光收白或者偏色,还可以优化 A 的offset ,H offset,shad offset.new offset 计算过程(Day locus offset 和M/G offset )

qq_46056347的博客 1167

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

redis性能测试调优分析

qq_38571773的博客 3334

新手必看!Unity中Tag和Layer的7个实际应用场景(含MOBA案例)

本文深入探讨Unity中Tag和Layer的7个实际应用场景,特别以MOBA游戏开发为例,详细解析如何利用LayerMask进行高效场景管理和碰撞检测优化。从双相机方案到射线检测的精准控制,帮助开发者掌握这些基础功能的进阶用法,提升游戏性能和开发效率。

weixin_28723171的博客 313

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

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

梦醒人间 1004

Modkit

Nmod- 通过过滤器分类为具有指定碱基修饰的残基的调用数量。Ncanonical- 通过过滤器分类为未修饰的碱基的调用数量。确切的碱基必须通过修饰代码推断。例如,如果修饰代码是m(5mC),则未修饰的碱基是胞嘧啶。如果修饰代码是a,则未修饰的碱基是腺苷。Nother mod- 通过过滤器分类为修饰的调用数量,但修饰不同于列出的碱基(且相应的未修饰碱基相同)。例如,对于给定的胞嘧啶,可能有 3 个读取带有h调用,1 个带有未修饰调用,2 个带有m调用。在h的 bedMethyl 行中,N。

生物信息学 1265

基于大模型的重度膝关节骨关节炎全流程预测与治疗方案研究

本研究基于大模型构建了重度膝关节骨关节炎(KOA)预测体系,涵盖术前风险预测、手术方案优化、术中监测和术后康复指导全流程。通过分析临床和影像数据,模型在手术风险预测准确率(85%)、并发症预警(血栓预测准确率88%)等方面显著优于传统方法。研究实现了临床数据与AI技术的深度融合,术前预测指导麻醉选择(如高危患者推荐椎管内麻醉),术中实时监测生命体征,术后个性化康复方案使患者HSS评分平均提升45分。

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 1389

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

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

jjc4261的博客 722

PyTorch 最新安装教程(2021-07-27)

PyTorch 最新安装教程(2021-07-27)前言1. 安装 Anaconda2. 检查显卡,更新驱动3. 创建PyTorch环境4. 配置清华TUNA镜像源5. 安装 PyTorch6. 测试 前言 万事开头难! 这句话又一次被我验证。 记得前不久刚陷入Tensorflow2.0的安装困境,这一次又被PyTorch 搞哭辽。 孩子太难了o(╥﹏╥)o,不过还好最终成功安装,感谢全网资源,感谢大佬们的博客!被我一次一次试了出来。 1. 安装 Anaconda Anaconda 是一个用于科学计算的 P

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 23万+

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

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

qq_43154385的博客 1613

[内网基础] 内网基础知识 —— Windows 工作组

在一个大型单位里,可能有成百上千台计算机互相连接组成局域网,如果不对这些计算机进行分组,网络的混乱程度是可想而知的。Windows 为了解决这一问题,就产生了工作组(Work Group)这个概念。Windows 工作组尝试将不通的计算机按功能(或部门)分别列入不同的工作组,例如技术部的计算机都列入 “技术部” 工作组、行政部的计算机都列入 “行政部” 工作组。要想访问某个部门的资源,只要在 “网络” 里双击该部门的工作组名,就可以看到该部门里的所有计算机了。

Blue17 の 小窝 1604

基于LLM的电商数据分析系统

随着电商行业的蓬勃发展,每天都会产生海量的数据,这些数据包含了用户的行为信息、商品信息、销售数据等。如何从这些繁杂的数据中提取有价值的信息,为电商企业的决策提供支持,成为了一个关键问题。基于LLM的电商数据分析系统的目的就是利用大语言模型强大的自然语言处理和数据分析能力,对电商数据进行深入挖掘和分析,帮助企业了解市场趋势、用户需求、商品销售情况等,从而制定更加合理的营销策略、优化商品库存管理、提升用户体验等。本系统的范围涵盖了电商领域的多个方面,包括用户行为分析、商品分析、销售数据分析等。

AI Python 编程之道的博客 808

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万+

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的远距离停车位检测系统(深度学习代码+UI界面+训练数据集)

本文详细介绍了基于YOLOv5/YOLOv6/YOLOv7/YOLOv8深度学习模型的远距离停车位检测系统的完整实现方案。该系统能够准确识别200米范围内的停车位状态,为智能停车场管理系统、自动驾驶车辆提供关键的视觉感知能力。文章涵盖算法原理、数据集构建、模型训练、系统实现及优化策略,并提供完整的代码实现和UI界面设计。关键词:YOLO系列,深度学习,停车位检测,计算机视觉,智能交通系统pythonimport cv2import os"""创建数据存储目录""""""定时采集图像"""

YOLO 185

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

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

u011537504的博客 1288

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

weixin_36168972的博客 346

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Redis瓶颈和调优

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

木子馋喵的知识杂货铺 1197

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【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、付费专栏及课程。

余额充值