【背景说明】

在7层负载均衡上,查询网络状态发现timewait太多,于是开始准备优化事宜

整体的拓扑结构,前面是lvs做dr模式的4层负载均衡,后端使用(nginx、or haproxy)做7层负载均衡

【优化效果】

修改前,建立连接的有29个,timewait的就达到了900个,如下图所示

修改后,建立连接的有32个,timewait的从900降低到了49个,如下图所示

【具体优化方案】

注意:前端使用nat时,不适用本策略。详细“方案详细介绍”会说明

修改7层负载所在机器,/etc/sysctl.conf

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_timestamps = 1

net.ipv4.tcp_fin_timeout = 20

保存后sysctl -p生效

【方案详细介绍】

net.ipv4.tcp_tw_reuse=1

#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;该文件表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接(这个对快速重启动某些服务,而启动后提示端口已经被使用的情形非常有帮助)

net.ipv4.tcp_tw_recycle=1

#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。

net.ipv4.tcp_timestamps 开启时,net.ipv4.tcp_tw_recycle开启才能生效,原因可以参考以下代码

  1.  
    if(tcp_death_row.sysctl_tw_recycle&&tp->rx_opt.ts_recent_stamp)recycle_ok=icsk->icsk_af_ops->remember_stamp(sk);
  2.  
    if(recycle_ok){
  3.  
    tw->tw_timeout=rto;
  4.  
    }
  5.  
    else{tw->tw_timeout=TCP_TIMEWAIT_LEN;
  6.  
    if(state==TCP_TIME_WAIT)
  7.  
    timeo=TCP_TIMEWAIT_LEN;
  8.  
    }

如果服务器身处NAT环境,安全起见,通常要禁止tcp_tw_recycle,如果nat下,开启了tcp_tw_recycle,可能会导致部分用户无法连接服务器的情况:在nat模式下(服务器一般会用到dnat,用户一般会用到snat),nat设备(or服务器)会修改目的ip和源ip,以屏蔽内部信息。试想很多用户snat出来,通过dnat访问网站,在dnat这层,时而会产生时间戳错乱的问题,那么基于tcp的时间戳的tcp_tw_recycle,就会出错。具体可参考

fc1323的扩展的说明

RFC1323TCPExtensionsforHighPerformanceMay1992

discardedwhenaconnectionisclosed.

AnadditionalmechanismcouldbeaddedtotheTCP,aper-host
cacheofthelasttimestampreceivedfromanyconnection.
ThisvaluecouldthenbeusedinthePAWSmechanismtoreject
oldduplicatesegmentsfromearlierincarnationsofthe
connection,ifthetimestampclockcanbeguaranteedtohave
tickedatleastoncesincetheoldconnectionwasopen.This
wouldrequirethattheTIME-WAITdelayplustheRTTtogether
mustbeatleastonetickofthesender'stimestampclock.
SuchanextensionisnotpartoftheproposalofthisRFC. Notethatthisisavariantonthemechanismproposedby
Garlick,Rom,andPostel[Garlick77],whichrequiredeach
hosttomaintainconnectionrecordscontainingthehighest
sequencenumbersoneveryconnection.Usingtimestamps
instead,itisonlynecessarytokeeponequantityperremote
host,regardlessofthenumberofsimultaneousconnectionsto
thathost.

大致意思为:tcp会记录每个连接的时间戳,如果后续时间戳比之前记录的时间戳小,就会认为这是错误的连接,拒绝这个连接。如果tcp_tw_recycle开启,那么这种规则就会被激活(那样才能快速回收连接)。所以在lvs使用nat的情况下,用户请求到lvs,LVS会修改地址数据后将请求转发给后端服务器,但不会修改时间戳(因为nat的机制就是只修改源地址和目的地址)。在后端服务器看来,请求的源地址永远都是LVS的地址,并且端口复用,原本不同客户端的请求经过LVS的转发,就可能会被认为是同一个连接,加之不同客户端的时间可能不一致,所以就会出现时间戳错乱的现象,于是后面的数据包就被丢弃了,具体的表现通常是是客户端明明发送的SYN,但服务端就是不响应ACK,还可以通过下面命令来确认数据包不断被丢弃的现象。就会出现部分用户能连接服务器,部分用户不能连接服务器的情况。

但在LVS使用用dr模式情况下,lvs只会修改mac和ip地址的映射关系,后端服务器看到的还是不通的用户ip,所以激活这一规则,也不会有问题。我们这里能使用这个策略,最大的原因也是在这里。

net.ipv4.tcp_timestamps=1

#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。

net.ipv4.tcp_fin_timeout = 15;这个参数是用来设置保持在FIN_WAIT_2状态的时间。tcp4此挥手,正常的处理流程就是在FIN_WAIT_2情况下接收到FIN进入到TIME_WAIT的情况,tcp_fin_timeout参数对处于TIME_WAIT状态的时间没有任何影响。但是如果这个参数设的比较小,会缩短从FIN_WAIT_2到TIME_WAIT的时间,从而使连接更早地进入TIME_WAIT状态。状态开始的早,等待相同的时间,结束的也早,客观上也加速了TIME_WAIT状态套接字的清理速度。

tcp连接的断开,可参考以下状态机:

【补充说明】

如果变更后运行命令netstat -s|grep timestamp

发现packets rejects in established connections because of timestamp

数值增加的很快,你可能得回滚这个变更了:说明使用snat访问你网站的人很多

因为:虽然服务器端没有使用nat,但是客户端使用snat的情况很多,如果后发现packets rejects in established connections because of timestamp增长很快,建议将这个方案回滚。那时,可使用修改net.ipv4.tcp_max_tw_buckets(centos默认似乎是 262144)可调整至100000。其实也说明,timeout数量不大的时候,其实可以不用调整tcp_tw_recycle参数(风险很大)。

【总结】

一个小小的变更,背后涉及的知识是异常多的,所以需要

1、不能随意找个方案就使用,需要深入理解。就像说这个A药可以治疗B症状,但是本质是A药可以治疗C病因情况下得B症状,需要把病因搞清楚了再吃药。就算侥幸治疗好了,也不能永远都是报这种侥幸心理。

2、对于内核参数调整,需要对每个参数都了解之后再行动,否则可能会有悲剧。

3、变更的时候,需要有一个灰度过程,需要观察一段时间后,再大面积修改。

服务器tcp连接timewait过多优化及详细分析的更多相关文章

  1. 服务器TCP连接中 TIME_WAIT 状态过多

    今天查看服务器的TCP连接数,发现其中 TIME_WAIT 状态的太多了: # netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a ...

  2. 查看服务器tcp连接及服务器并发

    一.查看哪些IP连接本机netstat -an二.查看TCP连接数1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数 ...

  3. 【故障公告】推荐系统中转站撑爆服务器 TCP 连接引发的故障

    上周五下午,我们在博客中部署了推荐系统,在博文下方显示“最新IT新闻”的地方显示自动推荐的关联博文.我们用的推荐系统是第四范式的推荐服务,我们自己只是搭建了一个推荐系统中转站(基于 ASP.NET C ...

  4. TCP连接的建立以及利用tcpdump分析连接建立的过程(转)

    原文地址:http://www.cnblogs.com/coser/archive/2010/12/05/1968812.html 一.实验目的 实验1_1: 使用Freebsd/Linux操作系统下 ...

  5. 客户机与服务器TCP连接状态

    客户机:

  6. TCP之再谈解决服务器TIMEWAIT过多的问题

    原则 TIMEWAIT并不是多余的.在TCP协议被创造,经历了大量的实际场景实践之后,TIMEWAIT出现了,因为TCP主动关闭连接的一方需要TIMEWAIT状态,它是我们的朋友.这是<UNIX ...

  7. 记录Redis连接未正确释放,TCP连接过多,造成服务器上部分功能不可用和linux服务器内存一直增加问题

    问题1 多人共享开发服务器(windows系统),我们小组有个程序,定时检测mongodb,redis,mysql连接是否正常,程序启动一段时间后,服务器管理人员找到我们说,我们的某个pid的程序把T ...

  8. TCP连接状态详解及TIME_WAIT过多的解决方法

    上图对排除和定位网络或系统故障时大有帮助,但是怎样牢牢地将这张图刻在脑中呢?那么你就一定要对这张图的每一个状态,及转换的过程有深刻地认识,不能只停留在一知半解之中.下面对这张图的11种状态详细解释一下 ...

  9. TCP/IP详解--TCP连接中TIME_WAIT状态过多

    TIMEWAIT状态本身和应用层的客户端或者服务器是没有关系的.仅仅是主动关闭的一方,在使用FIN|ACK|FIN|ACK四分组正常关闭TCP连接的时候会出现这个TIMEWAIT.服务器在处理客户端请 ...

随机推荐

  1. 201621123075作业07-Java GUI编程

    1. 本周学习总结 1.1 思维导图:Java图形界面总结 1.2 可选:使用常规方法总结其他上课内容. 2.书面作业 1. GUI中的事件处理 1.1 写出事件处理模型中最重要的几个关键词. 事件源 ...

  2. layer中每次用到都要查来查去的功能

    1.关闭当前弹出层 var index = parent.layer.getFrameIndex(window.name); setTimeout(function(){parent.layer.cl ...

  3. WindowsForms 调用API

    WindowsForms 后台 using System;using System.Collections.Generic;using System.ComponentModel;using Syst ...

  4. jvm内存溢出问题

     Java内存溢出详解 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出 J ...

  5. Scrapy爬虫框架中的两个流程

    下面对比了Scrapy爬虫框架中的两个流程—— ① Scrapy框架的基本运作流程:② Spider或其子类的几个方法的执行流程. 这两个流程是互相联系的,可对比学习. 1 ● Scrapy框架的基本 ...

  6. String Permutation

    Given two strings, write a method to decide if one is a permutation of the other. Example abcd is a ...

  7. Java容器解析系列(3) List AbstractList ListIterator RandomAccess fail-fast机制 详解

    做为数据结构学习的常规,肯定是先学习线性表,也就是Java中的List,开始 Java中List相关的类关系图如下: 此篇作为对Java中相关类的开篇.从上图中可以看出,List和AbstractLi ...

  8. LNMP(一)

    第二十课LNMP(一) 目录 一.LNMP架构介绍 二.MySQL安装 三.PHP安装 四.Nginx介绍 五.Nginx安装 六.扩展 一.LNMP架构介绍 之前已经学习过LAMP架构,与LAMP相 ...

  9. 编译darknet出现libpng16.so.16:对‘inflateValidate@ZLIB_1.2.9’未定义的引用

    cd /usr/lib/x86_64-linux-gnu sudo ln -s ~/anaconda/lib/libpng16.so.16 libpng16.so.16 sudo ldconfig## ...

  10. ios 审核未通过 相机相册权限问题

    苹果提交审核被打回来  附加的说明如下: We noticed that your app requests the user’s consent to access their camera but ...