当前位置:网站首页>php服务器 与redis交互大量CLOSE_WAIT分析
php服务器 与redis交互大量CLOSE_WAIT分析
2022-07-03 09:45:00 【dj1540225203】
最近发现有一台访问量很小(大概1000次/天)的服务器,在与redis交互的过程中,出现了大量的CLOSE_WAIT网络状态,导致fd资源被打满。初看很反直觉,访问量小而占用资源特别多,最终通过分析tcp协议,以及分析php-fpm模型,最终找到并解决了问题。
查询linux中tcp情况的命令:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 

大量close_wait状态
1.CLOSE_WAIT原理
在断开tcp连接时,会有一个4次挥手的过程。主动断开的一方会发起一个FIN包,接收方收到后会返回一个ACK包告知发起方我知道你要断开了,此时接收方状态变更为CLOSE_WAIT并处理收尾工作。正常的情况下,接收方在处理完收尾工作后,会给发起断开的一方发送一个FIN包,然后在收到断开发起方返回的ACK包以后,整个4次挥手的过程也就结束了。
但是不正常的情况下,接收方不发送FIN包,导致其状态一直是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.解决方案
改用短连接~
边栏推荐
猜你喜欢

The highest monthly salary of 18K has a good "mentality and choice", and success is poor "seriousness and persistence"~

Interviewer: what is the internal implementation of the list in redis?

Take you into the cloud native database industry, Amazon Aurora
The normal one inch is 25.4 cm, and the image field is 16 cm

硬 货 | 一改测试步骤代码就全写?为什么不试试用 Yaml实现数据驱动?

Software testing e-commerce projects that can be written into your resume, don't you come in and get it?

做软件测试三年,薪资不到20K,今天,我提出了辞职…

Communication software development and Application

Multiple IO transfer - preamble

How to make a blood bar in the game
随机推荐
QT:QSS自定义 QSpinBox实例
公司里只有一个测试是什么体验?听听他们怎么说吧
Extern keyword
MySQL -- index principle + how to use
Qt:qss custom qradiobutton instance
独家分析 | 关于简历和面试的真 相
Use ml.net+onnx pre training model to liven the classic "Huaqiang buys melons" in station B
Have you learned the new technology to improve sales in 2021?
Probability theory: application of convolution in calculating moving average
2021 reading summary (continuously updating)
如何让让别人畏惧你
QT: QSS custom qsplitter instance
sqlmap基本使用方法
Differences among norm, normalize and normalized in eigen
QT:QSS自定义 QSlider实例
现在零基础转行软件测试还OK吗?
QT:QSS自定义 QTabWidget 和 QTabBar实例
Definition and properties of summation symbols
QT:QSS自定义 QTreeView实例
Comment réaliser des tests automatisés pour les tests logiciels embarqués?