TIME_WAIT 优化注意事项

不同时开启tcp_timestamps和tcp_tw_recycle的场景描述

FULL NAT下

FULL NAT  在client请求VIP 时,不仅替换了package 的dst ip,还替换了package的 src ip;但VIP 返回给client时也替换了src ip

lvs后端为web服务器。

假如web服务器开启了tcp的tcp_timestamps和tcp_tw_recycle这两个参数。那么存在下面这种情况

RFC1323中有如下一段描述:

An additional mechanism could be added to the TCP, a per-hostcache of the last timestamp received from any connection.This value could then be used in the PAWS mechanism to rejectold duplicate segments from earlier incarnations of theconnection, if the timestamp clock can be guaranteed to haveticked at least once since the old connection was open. Thiswould require that the TIME-WAIT delay plus the RTT togethermust be at least one tick of the sender’s timestamp clock.Such an extension is not part of the proposal of this RFC.

大概意思是说TCP有一种行为,可以缓存每个连接最新的时间戳,后续请求中如果时间戳小于缓存的时间戳,即视为无效,相应的数据包会被丢弃。意思就是同一个源IP来连接同一个目的端口的数据包时间戳必须是递增的

Linux是否启用这种行为取决于tcp_timestamps和tcp_tw_recycle,因为tcp_timestamps缺省就是开启的,所以当tcp_tw_recycle被开启后,实际上这种行为就被激活了。

现在很多公司都用LVS做负载均衡,通常是前面一台LVS,后面多台后端服务器,这其实就是NAT,当请求到达LVS后,它修改地址数据后便转发给后端服务器,
但不会修改时间戳数据,对于后端服务器来说,请求的源地址就是LVS的地址,加上web端口会复用,所以从后端服务器的角度看,原本不同客户端的请求经过LVS的转发,
就可能会被认为是同一个连接,加之不同客户端的时间可能不一致,所以就会出现时间戳错乱的现象,于是后面的数据包就被丢弃了,
具体的表现通常是是客户端明明发送的SYN,但服务端就是不响应ACK,还可以通过下面命令来确认数据包不断被丢弃的现象

假如LVS地址是222.222.222.222,名字是L

web服务器地址为111.111.111.111,名字是W

比如客户端地址客户端C1地址为100.100.100.101,客户端C2地址为100.100.100.102

假如出现这种情况

13:23:02这个时间点

C1发出的TCP数据包源IP和源端口为100.100.100.101:6332,目标地址和端口是222.222.222.222:80

13:23:05这个时间点

C2发出的TCP数据包源IP和源端口为100.100.100.102:52223,目标地址和端口是222.222.222.222:80

经过LVS的full nat。

假如在13:23:06时刻LVS收到C2的数据包

C2的数据包被转换为

222.222.222.222:52223 ---->111.111.111.111:80

假如在13:23:07时刻LVS收到C1的数据包

C1的数据包被转换为

222.222.222.222:6332 ---->111.111.111.111:80

假如web服务器开启了tcp的tcp_timestamps和tcp_tw_recycle这两个参数。web服务器根据数据包的时间戳

C1的数据包由于时间戳小于目前系统登记的此源IP连接的时间戳,被认为是重传数据,C1的数据包就被丢弃了

(不仅lvs的full nat会出现源地址被替换的情况,一些3层交换机作为负载均衡也会把源地址替换掉)

这个参数默认2.4的内核就禁用了。我们是能不开启就不要开启

 注意点

1. tw_reuse,tw_recycle 必须在客户端和服务端timestamps 开启时才管用(默认打开),其实意思就是假如服务端和客户端两边有一边timestamps没开启。tw_reuse和tw_recycle都没啥作用
2. tw_reuse 只对客户端起作用,开启后客户端在1s内回收。reuse就是重用time_wait的socket连接。 服务端同一个端口被连接理论上是没限制的。
3. tw_recycle 对客户端和服务器同时起作用,开启后在 3.5*RTO 内回收,RTO 200ms~ 120s 具体时间视网络状况。
  内网状况比tw_reuse 稍快,公网尤其移动网络大多要比tw_reuse 慢,优点就是能够回收服务端的TIME_WAIT数量

对于客户端
1. 作为客户端因为有端口65535问题,TIME_OUT过多直接影响处理能力,打开tw_reuse 即可解决,不建议同时打开tw_recycle,帮助不大。
2. tw_reuse 帮助客户端1s完成连接回收,基本可实现单机6w/s请求,需要再高就增加IP数量吧。
3. 如果内网压测场景,且客户端不需要接收连接,同时tw_recycle 会有一点点好处。

对于服务端
1. 打开tw_reuse无效,因为是客户端连接web服务器,服务端肯定不会重用socket去主动连接客户端。这个参数服务器一般用不到,除非web服务器又作为客户端去连接后端数据库才用到。

但是web服务器作为客户端连接数据库达到6万端口的限制时你的数据库早承受不了压力瘫痪了。一般数据库5000连接数就已经很高了。

tw_resue这个参数,只有客户端用得到。意思就是重用处于time_wait的socket连接。

2. 线上环境 tw_recycle 不要打开
服务器处于NAT 负载后,或者客户端处于NAT后(这是一定的事情,基本公司家庭网络都走NAT);
公网服务打开就可能造成部分连接失败,内网的话到时可以视情况打开;
有些负载均衡设备会把timestamp 都给清空,后端web服务器开启不开启tw_recycle都无所谓了。

3. 服务器TIME_WAIT 高怎么办

服务器time_wait不用担心,因为我是服务端,是客户端很多IP和端口主动连接我的一个端口,比如连接我的80端口。很可能出现一种情况就是虽然我机器上有10万个time_wait连接。但是我的端口才用到一个80端口。

不像客户端有端口限制,处理大量TIME_WAIT Linux已经优化很好了,每个处于TIME_WAIT 状态下连接内存消耗很少,
而且也能通过tcp_max_tw_buckets = 262144 配置最大上限,现代机器一般也不缺这点内存。

总之,生产中,服务器不管有没有在nat设备后面.

tcp_tw_recycle不开启就行了。默认就是不开启的状态,值为0

tcp_timestamps保持默认开启就行了,值为1

tcp_tw_reuse.客户端最好开启。负载均衡设备连接web服务器时,辅助均衡设备也尽量开启

关于服务器端出现大量time_wait,有些人会问,我是web服务器端,为什么会出现客户端那种time_wait。

其实关于time_wait,它是出现在主动请求关闭连接的那一段。 服务器主动关闭http的连接。它就转变为了客户端。

发起断开连接这个动作,不是说就一定是客户端发起断开的。很多时候都是服务器端先发起断开连接操作。比如很多http服务器,短连接。很多时候服务器主动断开。

服务出现tcp连接问题可以先查看下下面,看看是否有很多,很多时候就是开启了tcp_tw_recycle导致的

?


1

2

3

[[email protected] ~]$ netstat -s | grep timestamp

    351 packets rejects in established connections because of timestamp

[[email protected] ~]$

  

客户端相关优化的地方如下。(服务器不开启tcp_tw_recycle即可)

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

[[email protected] ~]# cat /proc/sys/net/ipv4/ip_local_port_range

32768   61000

[[email protected] ~]# cat /proc/sys/net/ipv4/tcp_timestamps

1

[[email protected] ~]# cat /proc/sys/net/ipv4/tcp_tw_recycle

0

[[email protected] ~]# cat /proc/sys/net/ipv4/tcp_tw_reuse

0

[[email protected] ~]# echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse

[[email protected] ~]# cat /proc/sys/net/ipv4/tcp_tw_reuse

1

[[email protected] ~]# echo "10240  62000" > /proc/sys/net/ipv4/ip_local_port_range

[[email protected] ~]# cat /proc/sys/net/ipv4/ip_local_port_range

10240   62000

[[email protected] ~]#

  

原文地址:https://www.cnblogs.com/wuhg/p/11652440.html

时间: 2024-10-11 07:34:29

TIME_WAIT 优化注意事项的相关文章

mysql性能优化注意事项以及索引

 mysql性能优化注意事项以及索引 一:数据库的优化方面 1商业需求的影响 比如说论坛里的帖子统计,并且实时更新 从功能上来说通过命令   select  count(*) from 表名 可以得到结果,如果论坛每秒产生产生成千上万条帖子,我们没有采用myisam存储而用的是innodb存储:就算再好的设备也不可能很快的查询出来. 注:在where和count(*)使用中myisam比innodb要快的多:因为myisam内置了一个计数器,count(*)可以直接从计数器当中读取,而innod

企业网站站内优化注意事项

企业搭建网站完成之后,需要做的第一件事情便是做好网站的站内优化,只有站内优化基础扎实以后,后期的SEO优化才更加顺利.在企业站内优化的过程当中需要注意哪些事项呢?下面一起来了解一下.       1.网站结构扁平化 网站结构是搜索引擎蜘蛛提升抓取效率,是用户浏览习惯的最佳体现方式.网站上线后,先不要急于优化标签.代码等,首先要进行分析和调整的是网站结构,结构优化最好采用扁平化,因为企业网站本身栏目较少,这些栏目层次几乎是权重持平和对等的,这样有利于整个网站的优化水平的提升.   2.URL静态化

14个不利于网站优化的事项

东莞网站优化如何排除不利于网站优化的事项,提高网站排名是每个seoer的最终目标.SEO的过程就是知道和了解搜索引擎蜘蛛如何去抓取网站页面,然后对于网页本身进行一些调整,比如网站框架优化,代码优化等,使得搜索引擎蜘蛛(SPIDER)更顺利地抓取到页面的内容的过程.但是咱们在优化过程中,四海营销提醒您一定要避免以下14个不利于网站优化的14个注意事项: 第一.频繁改动标题 如果网站权重不高,建议大家不要随便更改标题,因为更改一次搜索引擎就会重新审核一次,增加搜索引擎的判读成本.那么什么类型的网站是

wap网站即手机端网页SEO优化注意事项及方法

定位和页面设计: 无论是PC端还是移动端,网站 都要考虑清楚消费群体的定位问题.虽然智能手机用户数量非常普及,但是要明白中国的大部分手机用户使用的还是2G网络,一直高 喊的3G.4G手机用户只有大约15%左右.所以,在页面设计时,要考虑到用户打开网页的时长,一些炫丽的flash.JS等建议还是不用为好.这不仅仅 是用户体验的问题,也是尽量减少百度索引抓取的工作,让百度蜘蛛尽可能多的爬行和收录页面. 网站尽可能简洁: ①手机网站比PC端网站的页面下载速度要慢得多,因此尽量把页面数和页面大小控制到最

Linux socket TIME_WAIT 优化

如发现系统存在大量TIME_WAIT状态的连接,通过调整内核参数解决,vim /etc/sysctl.conf编辑文件,加入以下内容:net.ipv4.tcp_syncookies = 1net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_fin_timeout = 30然后执行 /sbin/sysctl -p 让参数生效. net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies.当出现

关于mysql运行效率优化注意事项及要点

1. SQL优化的原则是:将一次操作须要读取的BLOCK数减到最低,即在最短的时间达到最大的数据吞吐量. 调整不良SQL通常能够从下面几点切入: ? 检查不良的SQL,考虑其写法是否还有可优化内容 ? 检查子查询 考虑SQL子查询能否够用简单连接的方式进行又一次书写 ? 检查优化索引的使用 ? 考虑数据库的优化器 2. 避免出现SELECT * FROM table 语句,要明白查出的字段. 3. 在一个SQL语句中,假设一个where条件过滤的数据库记录越多,定位越准确,则该where条件越应

SQL性能优化注意事项

1.选用适合的Oracle优化器 Oracle的优化器共有3种: a.RULE(基于规则) b.COST(基于成本) c.CHOOSE(选择性) 设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE.COST.CHOOSE.ALL_ROWS.FIRST_ROWS.你当然也在SQL句级或是会话(session)级对其进行覆盖. 为了使用基于成本的优化器(CBO,Cost-Based Optimizer),你必须经常运行analyze命令,以增加数

SEO 优化注意事项

一.站内优化 1.做好HTML头标签 标题(title):标题是网页优化中相当有分量,一般网页title主要包含一些关键词.网站名称等. 关键词(keyword):重要性大家都知道!关键词设定要参考热度.百度指数等一些手段,当然选择这些的前提要与自己网站的主题相关.关键词不宜多,一般就是1-3个. 描述(description):主要是对网站的一个介绍,虽然没有前两个标签在搜索引擎蜘蛛眼中作用大,但是也是不可忽略的一个因素.用户搜索时显示在搜索引擎网页中的只有它跟title,站在用户角度上,了解

关于mysql执行效率优化注意事项及要点

1. SQL优化的原则是:将一次操作需要读取的BLOCK数减到最低,即在最短的时间达到最大的数据吞吐量. 调整不良SQL通常可以从以下几点切入: ? 检查不良的SQL,考虑其写法是否还有可优化内容 ? 检查子查询 考虑SQL子查询是否可以用简单连接的方式进行重新书写 ? 检查优化索引的使用 ? 考虑数据库的优化器 2. 避免出现SELECT * FROM table 语句,要明确查出的字段. 3. 在一个SQL语句中,如果一个where条件过滤的数据库记录越多,定位越准确,则该where条件越应