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

相关推荐

网络系统实现技术之IPX与SPX

IPX/SPXNovell NetWare网络Novell公司为适应网络发展,将主机网络转换为PC网络,开发了Novell NetWare网络系统。该系统中基于客户机/服务器模式。以普通PC机做为客户机,以性能强大的服务器做为服务器,为客户机提供文件服务、数据库服务及其他服务。与前面的SNA模型一样,Novell NetWare也早于OSI模型,所以不能与OSI模型严格对应,但也有很明

成片的大树 9164

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

redis性能测试调优分析

qq_38571773的博客 3334

grafana对接zabbix数据展示

【配置】点击【模板】点击【创建模板】添加三个监控项:【名称】搜索【】创建的模板;点击上方【监控项】,点击创建【监控项】点击上方【触发器】点击【创建触发器】主机关联监控模板:左侧【配置】点击 【主机】点击【Zabbix server】查看:左侧点击【监测】点击【主机】点击【Zabbix server】点击最新数据,找到添加的三个模板主机关联监控模板:左侧【配置】点击 【主机】点击【Zabbix server】把监控模板用起来① 明确获取指标数据的方法。

2401_83883919的博客 6593

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

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

梦醒人间 1004

Windows 10下三菱PLC控件安装报错Error Number:-119的终极解决方案(附详细步骤)

本文针对Windows 10系统安装三菱PLC控件时常见的Error Number:-119报错,提供了深度分析与终极解决方案。文章剖析了该错误源于oleaut32.dll文件版本冲突,并详细介绍了通过设置兼容性模式、手动注册DLL、直接安装MX Component以及高级系统修复等多种方法,帮助用户彻底解决此安装难题,顺利搭建PLC开发环境。

weixin_29289821的博客 332

从Mate到Mate40 Pro+:华为旗舰核心配置演进与选购避坑指南

本文回顾了华为Mate系列从初代到Mate40 Pro+的核心配置演进历程,重点分析了处理器性能、影像系统、屏幕设计及续航快充的技术突破。针对选购需求,提供了区分版本、5G选择及存储配置的实用避坑建议,帮助消费者明智选择华为旗舰机型。

weixin_30015371的博客 494

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

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

jjc4261的博客 722

问题解决:打开VMware创建的虚拟机,电脑立刻蓝屏并重启

VMware Workstation 与 Device/Credential Guard 不兼容。在禁用 Device/Credenti

weixin_55118477的博客 3万+

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

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

qq_43154385的博客 1613

【音视频 ffmpeg 学习】 RTMP推流 mp4文件

3.当RTMP协议在互联网中传输数据的时候,消息会被拆分成更小的单元,称为消息块(Chunk)。1.RTMP(实时消息传输协议)是Adobe 公司开发的一个基于TCP的应用层协议。2.RTMP协议中基本的数据单元称为消息(Message)。下载地址:http://nginx.org/download。下载 rtmp模块 到nginx 模块下。安装nginx 和 rtmp模块。(1). linux 环境准备。下载nginx安装包。使用 vcl 播放流。

weixin_45397344的博客 2274

Coze智能体开发:搭建一个解析 PDF 文件的工作流

大模型本身并不具备文件读取和解析的能力,无法直接处理文件字节流。对于支持工具调用(Function calling)的模型,扣子提供插件功能来帮助大模型调用外部工具 API,拓展大模型的能力边界。扣子插件商店提供海量官方插件和第三方插件,例如链接读取插件可以将链接对应的文件内容解析为纯文本传递给大模型。

王国平的博客 2813

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

openclaw本地模型对接

使用是官方推荐的一种集成方式,它可以简化配置过程。但由于您的系统环境和之前复杂的配置历史,我为您梳理了一个核心流程,并增加了关键的“事后检查”步骤,以确保能从根本上解决问题。

suny8的专栏 2460

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

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

u011537504的博客 1288

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

VB摄像头监控

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

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

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

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

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

余额充值