背负青天而莫之夭阏者,而后乃今将图南。
百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 互联网 > 技术教程 > 正文

php服务器 与redis交互大量CLOSE_WAIT分析

swdejp 2023-08-14 271 浏览 2 评论

最近发现有一台访问量很小(大概1000次/天)的服务器,在与redis交互的过程中,出现了大量的CLOSE_WAIT网络状态,导致fd资源被打满。初看很反直觉,访问量小而占用资源特别多,最终通过分析tcp协议,以及分析php-fpm模型,最终找到并解决了问题。

php服务器 与redis交互大量CLOSE_WAIT分析

大量close_wait状态

1.CLOSE_WAIT原理

在断开tcp连接时,会有一个4次挥手的过程。主动断开的一方会发起一个FIN包,接收方收到后会返回一个ACK包告知发起方我知道你要断开了,此时接收方状态变更为CLOSE_WAIT并处理收尾工作。正常的情况下,接收方在处理完收尾工作后,会给发起断开的一方发送一个FIN包,然后在收到断开发起方返回的ACK包以后,整个4次挥手的过程也就结束了。
但是不正常的情况下,接收方不发送FIN包,导致其状态一直是CLOSE_WAIT状态,如果每一个连接都这样,就会占用大量的系统资源,导致无法对外提供服务。

php服务器 与redis交互大量CLOSE_WAIT分析

4次挥手

2.访问量这么小的php服务器,与redis 交互为什么会出现CLOSE_WAIT状态

php与redis交互分析

在php中,并没有redis连接池的概念,所以为了避免不断地连接、断开与redis的连接,我们在php中一般采用长连接的形式与redis进行交互。

这种形式创建的连接的生命周期和php-fpm进程的生命周期是一致的,所以每次有新的请求过来,都会复用php-fpm最初创建的redis连接,这样就节省了不断的连接、断开连接redis产生的网络开销。

php-fpm的生命周期

php-fpm 有一个配置pm.max_requests表示,php-fpm进程经过pm.max_requests个请求后会销毁并生新生成一个子进程。这也就代表着1个fpm了进程需要经历max_requests个请求后才会销毁

pm.max_requests = 50240

定位到问题

从php与redis的交互分析,可以得出:一个reids长连接的生命周期和php-fpm子进程是一致的。
而php-fpm的生命周期为经历pm.max_requests 个请求,而我们服务器的配置为50240。
同时,出现问题的服务器访问量特别小(1000次/天),也就是说一个php-fpm的生命周期至少为50天(50240/1000=50,应该更多的,因为不止一个进程),那么redis连接的生命周期也至少为50天。
在这50天中,redis会给php服务器发起断开请求,php服务器会返回一个ACK,然后变更状态为CLOSE_WAIT,但是php服务器不会再发送一个FIN包给redis,因为它的生命周期没有结束。所以最终会产生大量的CLOSE_WAIT。

3.为什么访问量大反而不会出现CLOSE_WAIT

访问量大,意味着php-fpm进程的max_requests很容易触达,php-fpm的生命周期会很短,还达不到redis服务器的超时断开的触发时机。

4.解决方案

改用短连接~

相关推荐

如何查看仓库(REPOSITORY)的具体版本了

我们通常从docker仓库里下载了PHP,不知道什么版本的。我们看一下库里有什么镜像[root@localhost~]#dockerimagels[root@localhost~]#doc...

程序员应知应会之Spring Data Jpa为什么不用写@Repository注解?

大家知道,在Springboot+SpringDataJpa的项目里,dao层只需要继承JpaRepository接口,就可以实现Mybatis中@Repository+mapper的效果,不需要...

Maven:mirror和repository的关系&区别

1.1结论1、repository(仓库)存放具体依赖jar包的地方,而mirror(镜像)是一个拦截器,可以拦截某个仓库将原始的仓库地址重定向到镜像指定的地址中去(主要是为了提高下载速度,例如从国...

终于弄懂了Spring@Component @Repository@Service的区别

专注于Java领域优质技术号,欢迎关注问题在spring集成的框架中,注解在类上的@Component,@Repository,@Service等注解能否被互换?或者说这些注解有什么区别?回答1引用s...

阿里技术专家详解DDD系列 第三讲 - Repository模式

作者|殷浩出品|阿里巴巴新零售淘系技术部写在前面:这篇文章和《阿里技术专家详解DDD系列第二弹-应用架构》隔了比较久,一方面是工作比较忙,另一方面是在讲Repository之前其实应该先讲Ent...

领域实体是否可以访问资源库Repository?

领域实体(Domainentities)通常指的是在软件开发领域中用于表示业务逻辑和业务规则的对象。这些对象通常封装了与特定领域相关的数据和行为。领域实体是否可以访问资源库(Repository),...

GitHub入门创建仓库和管理仓库(Repository)

一个Git库(仓库)对应一个开源项目,通过Git管理Git库。创建仓库在GitHub主页点击“Startaproject”,然后输入:Repositoryname(仓库名称,一般是项目名称)、D...

单细胞分析:marker鉴定(11)

导读前面我们已经确定了我们想要的簇,我们可以继续进行标记识别,这将使我们能够验证某些簇的身份并帮助推测任何未知簇的身份。1.学习目标学会确定单个簇的marker学会在聚类和marker识别间进行迭代...

FreeMarker介绍

1.1FreeMarker简介lFreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写lFreeMarker被设计用来生成HTMLWeb页面,特别是基于M...

分手的时候,教你一招怎么将自己和前男/女友从照片里面分割出去

分手的时候,很多人看着以前的亲密照片,最想做的是啥?对,没错,就是剪照片或者撕照片。但是有的时候,那个照片你又很喜欢,不舍得删除电子照片怎么办?今天教你一招,怎么将ta分割出去。这个办法很简单,就是使...

使用 Plotly 绘图的太阳系 3D 模型

太阳系太阳系是一个受太阳引力约束在一起的恒星系统,包括太阳以及直接或间接围绕太阳运动的天体。轨道环绕太阳的天体被分为三类:行星、矮行星、和太阳系小天体。行星是环绕太阳且质量够大的天体。这类天体:1、有...

261.C# ScottPlot 基本入门

摘要ScottPlot是一个功能强大的C#绘图库,特别适用于WinForm开发。它提供了丰富的图表类型和定制化选项,使开发者能够轻松地在应用程序中绘制高质量的图表和数据可视化。正文数据可视化:Scot...

「Plotly快速入门」用Plotly绘制了几张精湛的图表,美翻了

作者:俊欣来源:关于数据分析与可视化说到Python当中的可视化模块,相信大家用的比较多的还是matplotlib、seaborn等模块,今天小编来尝试用Plotly模块为大家绘制可视化图表,和前两者...

SAM + YOLO = 自动抠图

在计算机视觉领域,对象检测和实例分割是使机器能够理解视觉数据并与之交互的关键任务。准确识别和隔离图像中的物体的能力具有许多实际应用,从自动驾驶车辆到医学成像。在这篇博文中,我们将探索如何在Robo...

Matplotlib画图如此简单

jupyter入门之Matplotlib一.Matplotlib基础知识Matplotlib中的基本图表包括的元素x轴和y轴axis水平和垂直的轴线轴标签axisLabel水平和垂直的轴标签...

已有2位网友发表了看法:

  • swdejp

    swdejp  评论于 [2022-03-07 21:18:28]  回复

    php redis 造成CLOSE_WAIT 与 FIN_WAIT2

  • swdejp

    swdejp  评论于 [2022-03-07 21:22:02]  回复

    CLOSE_WAIT redis

取消回复欢迎 发表评论: