博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux服务器出现大量CLOSE_WAIT状态的连接
阅读量:4028 次
发布时间:2019-05-24

本文共 1636 字,大约阅读时间需要 5 分钟。

http://blog.kankanan.com/article/linux-670d52a1566851fa73b0592791cf-close_wait-72b6600176848fde63a5.html

昨天服务器停止服务,node.js进程耗光了服务器的内存及CPU,node.js进程卡死无法被 kill 掉,最后要来root帐号密码,直接 kill -9 才结束掉进程。

再次鄙视一下  ,杀不掉原来的 node.js 进程组也就罢了,竟然又拉起了一套新的 node.js 进程组。

统计了一下 10 万个fd都耗光了,其中 9 万多个为 CLOSE_WAIT 状态,此时服务器已经无法响应请求。

CLOSE_WAIT 状态介绍

先看一副TCP连接关闭的状态图(  ):

tcp_normal_close.png

被动关闭一方才会出现 CLOSE_WAIT 状态,由于被动关闭方未调用 close 关闭socket导致,问题肯定是由服务器代码引起。

检测到对端socket关闭然后关闭本端socket是由 node.js 自行完成的,最大的可能是没有机会执行 close 。

我们的应用客户端与服务器有一个tls长连接,当连接断开时客户端会等待3-10秒后尝试重连服务器,如果服务器出现卡顿会导致客户端频繁重连,

如果服务器来不及关闭这些连接,则会出现 CLOSE_WAIT 状态的连接,占用大量文件描述符,减少 CLOSE_WAIT 超时时间能够在一定程度上缓解这个问题,

但是对于我们这种长连接的环境,大量CLOSE_WAIT是问题的表象,而非根源。

参考:《》

内存及CPU占用彪升问题

伴随着 CLOSE_WAIT 出现的状况是 node.js 进程内存及CPU占用超高,单node.js进程内存占用达到 1.5G,CPU占用 90% 以上,此时应该会导致 node.js 响应慢, 来不及关闭连上来的socket。

所以解决问题的关键就是:找出什么原因导致 node.js 内存及CPU 100%占用。

想到的可能是redis负载过高引起,从运维监控图上可以看出一些蹊跷,node.js出问题时redis的连接数也同样彪升,而出问题的机器上刚好就是跑redis的机器, 另一台服务器一直相安无事,没有跑redis。

一次午夜故障元凶浮出水面

在晚上两点的时候服务出现问题,同样的现象,特别留意了一下redis的统计,请求速度很低,只有1200,平时都是5000。偶然在进程列表中发现了 redis-rdb-bgsave 的身影, 不断地执行ps看进程列表,发现 redis-rdb-bgsave 进程不断地出现,查看redis的持久化配置如下:

save 900 1save 300 10save 60 10000

我们的系统有大量的redis,1分钟肯定过万,这样redis持久化变是常态了,而且由于用的是机械硬盘,持久化肯定会引起系统卡顿,先将它调整为15分钟最多持久化一次:

config set save "900 1"

重启程序释放资源后系统开始正常响应,但是10多分钟后系统再次无响应,才想起一则经验教训:

跑redis的机器至少要预留和redis占用内存同样大小的空闲内存空间,redis RDB持久化进行fork时最坏会占用双倍内存,内存不足就会动用交换分区,系统性能急剧下降。

于是,立即改配置将redis所在机器上的node.js cluster进程数调小,腾出大把内存,总算没有再出现问题,今晚终于可以入眠。

更多疑问

  • 我们的node.js进程为什么常常会占用很多内存?
  • netstat中看到CLOSE_WAIT状态的连接输入缓冲往往有数据,而ESTABLISHED状态的连接读写缓冲区往往为空,为什么?
  • node.js卡顿时forever杀不死反而启动了新实例帮倒忙,pm2就一定能够解决吗?
  • redis持久化引起服务挂掉,已经是在第二个项目中遇到了,终极解决方案是什么?

转载地址:http://zylbi.baihongyu.com/

你可能感兴趣的文章
android给文字加边框(修改不能居中的问题)
查看>>
coursesa课程 Python 3 programming course_2_assessment_1
查看>>
coursesa课程 Python 3 programming 统计文件有多少单词
查看>>
coursesa课程 Python 3 programming 输出每一行句子的第三个单词
查看>>
coursesa课程 Python 3 programming Dictionary methods 字典的方法
查看>>
Returning a value from a function
查看>>
coursesa课程 Python 3 programming Functions can call other functions 函数调用另一个函数
查看>>
coursesa课程 Python 3 programming Tuple Assignment with Unpacking
查看>>
coursesa课程 Python 3 programming The while Statement
查看>>
course_2_assessment_6
查看>>
coursesa课程 Python 3 programming course_2_assessment_7 多参数函数练习题
查看>>
coursesa课程 Python 3 programming course_2_assessment_8 sorted练习题
查看>>
visca接口转RS-232C接口线序
查看>>
在unity中建立最小的shader(Minimal Shader)
查看>>
1.3 Debugging of Shaders (调试着色器)
查看>>
关于phpcms中模块_tag.class.php中的pc_tag()方法的含义
查看>>
vsftp 配置具有匿名登录也有系统用户登录,系统用户有管理权限,匿名只有下载权限。
查看>>
linux安装usb wifi接收器
查看>>
关于共享单车定位不准问题
查看>>
终于搞定CString和string之间转换的问题了
查看>>