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

相关推荐

LVGL与STM32的理解(基于正点原子资料)

我们要在lcd_draw_fast_rgb_color里面实现对屏的具体操作(也就是在这里实现自己的代码)。lcd_set_window、lcd_write_ram_prepare、lcd_wr_data这三个函数是本例程LCD屏的控制函数(也就是自己写的函数)。以下是stm32工程的文件目录,GUI_APP也可以忽略(细节参考正点原子例程):这里主要是再次加强一下印象,主要就是把。,里面的lcd_init()与lcd_display_dir是。它们都是LVGL的接口,按照它们的需求,把内容给它们即可。

weixin_39257775的博客 3437

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

redis性能测试调优分析

qq_38571773的博客 3334

matlab snr矩阵计算公式_基于MATLAB和Adams的悬置系统解耦计算方法对比

一、概述动力总成悬置系统主要有两个作用:一是固定和支撑动力总成,限制动力总成在各种工况下的位移量,防止与其它部件碰撞;二是隔振作用,将动力总成的振动尽可能少的传递到车身。悬置系统隔振性能的核心就是解决刚体模态的频率分配和振动耦合问题,简言之就是关注动力总成的刚体模态和解耦率。动力总成悬置系统的刚体模态频率和能量解耦分析,行业内的主流计算方法分两种:一是用MATLAB编程进行分析计算,二是...

weixin_33416900的博客 1449

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

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

梦醒人间 1004

DataGridView 右键菜单复制(公共)

dataGridView1.CellMouseClick += new DataGridViewCellMouseEventHandler( (sender1, e1) => { if (e1.Button == MouseButtons.Right) {

沁心渃水 2832

PCL读取点云数据报错:Failed to find match for field ‘x‘/ ‘y‘/ ‘z‘.

原因:使用matlab生成的pcd文件,点云数据是双精度类型,pcl处理的点云数据是单精度类型。解决方案:使用matlab生成的点云坐标单精度化,然后在生成点云加以存储。

little_white138的博客 869

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

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

jjc4261的博客 722

【DEIM创新改进】独家下采样创新改进篇 | ECCV 2026 | DEIM 引入FSD-Down频域-空间动态下采样,在下采样过程中保留小目标的高频信息、助力小目标检测、遥感小目标检测有效涨点

🔥本文提出了一种名为FSD-Down的频域-空间动态下采样模块,用于改进DEIM网络模型在小目标检测中的性能。FSD-Down通过小波分解显式保留低频语义和高频细节,结合分组卷积、动态通道权重和可学习缩放因子,自适应强化目标边缘与纹理特征。该模块能有效减轻传统下采样造成的频率混叠和细节丢失,提升对小目标、密集目标和低对比度目标的检测能力。实验表明,FSD-Down计算开销可控,在保持实时性的同时显著提升检测精度,特别是在VisDrone和AITODv2数据集上对小目标的检测性能提升显著。

Ai缝合怪、助力小伙伴高效发论文 82

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

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

qq_43154385的博客 1613

Microsemi Libero系列教程(六)——Identify片上逻辑分析仪的使用

文章目录FPGA如何进行在线调试关于Microsemi片上逻辑分析仪FPGA片上逻辑分析仪原理预期效果0.准备一个创建好的Libero工程1.新建identify工程,并添加想要监测的信号2.管脚分配,编译下载3.设置触发类型4.IICE逻辑分析仪核资源占用 系列教程:Microsemi Libero系列教程 FPGA如何进行在线调试 对于嵌入式系统来说,如单片机,进行硬件级程序调试时,通常采用的是JLink/ST-Link调试器,在线调试的方式来获取程序实时运行的状态,可以观察程序运行流程、各种变量的值

whik1194的博客 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

u011537504的博客 1288

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

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

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

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

weixin_36168972的博客 346

Redis瓶颈和调优

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

木子馋喵的知识杂货铺 1197

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

余额充值