当前位置: 首页 > news >正文

web服务器下出现大量TIME_WAIT

转载自:https://blog.csdn.net/langfetters/article/details/49492409

查看系统的网络连接状态检测到服务器有大量的time_wait,决定优化内核参数试验下:

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT        836   
FIN_WAIT1        2      
ESTABLISHED      47    
SYN_RECV         1     

状态:描述 
CLOSED:无连接是活动的或正在进行 
LISTEN:服务器在等待进入呼叫 
SYN_RECV:一个连接请求已经到达,等待确认 
SYN_SENT:应用已经开始,打开一个连接 
ESTABLISHED:正常数据传输状态 ,表示正通信
FIN_WAIT1:应用说它已经完成 
FIN_WAIT2:另一边已同意释放 
ITMED_WAIT:等待所有分组死掉 
CLOSING:两边同时尝试关闭 
TIME_WAIT:另一边已初始化一个释放 ,表示主动关闭    CLOSE_WAIT:被动关闭
LAST_ACK:等待所有分组死掉

在高并发短连接的server端,当处理完client请求后立刻closesocket此时会出现time_wait,client再并发2000个连接,此时部分连接则连接不上了。

time_wait状态,持续2*MSL(Max Segment Lifetime)两倍最大段生存期,MSL的值是2分钟,缺省240s,但是在实际的实现中,常用的值有以下三种:30秒,1分钟,2分钟。对于基于TCP的HTTP协议,关闭TCP连接的是Server端,这样,Server端会进入TIME_WAIT状态,可想而知,对于访问量大的Web Server,会存在大量的TIME_WAIT状态,假如server一秒钟接收1000个请求,那么就会积压240*1000=240,000个TIME_WAIT的记录

服务器保持了大量TIME_WAIT状态

这种情况比较常见,一些爬虫服务器或者WEB服务器(如果网管在安装的时候没有做内核参数优化的话)上经常会遇到这个问题,TIME_WAIT是主动关闭连接的一方保持的状态,对于爬虫服务器来说他本身就是“客户端”,在完成一个爬取任务之后,他就会发起主动关闭连接,从而进入TIME_WAIT的状态,然后在保持这个状态2MSL(max segment lifetime)时间之后,彻底关闭回收资源。为什么要这么做?明明就已经主动关闭连接了为啥还要保持资源一段时间呢?这个是TCP/IP的设计者规定的,主要出于以下两个方面的考虑:

1.防止上一次连接中的包,迷路后重新出现,影响新连接(经过2MSL,上一次连接中所有的重复包都会消失)
2.可靠的关闭TCP连接。在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。另外这么设计TIME_WAIT 会定时的回收资源,并不会占用很大资源的,除非短时间内接受大量请求或者受到攻击。

 

 

[plain]  view plain copy
 
 
 
  1. #以下引用摘自网上的/etc/sysctl.conf文件的修改参考说明:  
  2. #对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃,不应该大于255,默认值是5,对应于180秒左右时间  
  3. net.ipv4.tcp_syn_retries=2  
  4. #net.ipv4.tcp_synack_retries=2  
  5. #表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为300秒  
  6. net.ipv4.tcp_keepalive_time=300  
  7. net.ipv4.tcp_orphan_retries=3  
  8. #表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间  
  9. net.ipv4.tcp_fin_timeout=30  
  10. #表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。  
  11. net.ipv4.tcp_max_syn_backlog = 4096  
  12. #表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭  
  13. net.ipv4.tcp_syncookies = 1  
  14. #表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭  
  15. net.ipv4.tcp_tw_reuse = 1  
  16. #表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭  
  17. net.ipv4.tcp_tw_recycle = 1  
  18. #减少超时前的探测次数  
  19. net.ipv4.tcp_keepalive_probes=5  
  20. #优化网络设备接收队列  
  21. net.core.netdev_max_backlog=3000  



 

 

目前的解决思路,就是让服务器能够快速回收和重用那些TIME_WAIT的资源,让每个TIME_WAIT早点过期。

#vim /etc/sysctl.conf 追加或修改两行参数

  net.ipv4.tcp_tw_reuse = 1 让TIME_WAIT状态可以重用,即使time_wait占满了所有端口,也不会拒绝新请求
  net.ipv4.tcp_tw_recycle = 1 让time_wait尽快回收,开启是为了加速回收处于TIME_WAIT状态的资源
#sysctl –p 使内核参数生效

注另外参数:

net.ipv4.tcp_tw_reusenet.ipv4.tcp_tw_recycle的开启都是为了加速回收处于TIME_WAIT状态的资源。
net.ipv4.tcp_fin_timeout这个时间可以减少在异常情况下服务器从FIN-WAIT-2转到TIME_WAIT的时间。
net.ipv4.tcp_keepalive_*一系列参数,是用来设置服务器检测连接存活的相关配置。
 

再用netstat查了下:

TIME_WAIT 2087  已从13695多降为2087,先试运行一段时间看看有无问题
ESTABLISHED 553
LAST_ACK 1

转载于:https://www.cnblogs.com/zzzao/p/9642335.html

相关文章:

  • 正则 常见2
  • js限制文本框只能输入数字方法小结
  • VC++文件操作之最全篇
  • SDN控制器列表
  • jdbc学习
  • [HNOI2006]鬼谷子的钱袋
  • ES6装饰器Decorator基本用法
  • 章节六、3-读取Properties属性文件
  • Qt读写ini文件
  • js的Date.parse()方法和getTime()的坑
  • 图像匹配之欧式距离算法(转)
  • OSS图片 数据处理持久化 JAVA实现
  • 微服务之excel导出
  • [LeetCode] 93. Restore IP Addresses 复原IP地址
  • node.js 事件处理模式
  • 时间复杂度分析经典问题——最大子序列和
  • Android Volley源码解析
  • HashMap剖析之内部结构
  • If…else
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • javascript数组去重/查找/插入/删除
  • Java小白进阶笔记(3)-初级面向对象
  • js递归,无限分级树形折叠菜单
  • Laravel5.4 Queues队列学习
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • PHP面试之三:MySQL数据库
  • SpriteKit 技巧之添加背景图片
  • STAR法则
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 配置 PM2 实现代码自动发布
  • 七牛云假注销小指南
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 学习使用ExpressJS 4.0中的新Router
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • (30)数组元素和与数字和的绝对差
  • (day6) 319. 灯泡开关
  • (function(){})()的分步解析
  • (待修改)PyG安装步骤
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (过滤器)Filter和(监听器)listener
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (强烈推荐)移动端音视频从零到上手(上)
  • (算法设计与分析)第一章算法概述-习题
  • (转)可以带来幸福的一本书
  • .NET Core 通过 Ef Core 操作 Mysql
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET与 java通用的3DES加密解密方法
  • .NET中GET与SET的用法
  • ?
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • @RequestBody的使用
  • @RequestMapping 的作用是什么?
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?