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
|
[game@localhost ~]$ netstat -s | grep timestamp 351 packets rejects in established connections because of timestamp[game@localhost ~]$ |
客户端相关优化的地方如下。(服务器不开启tcp_tw_recycle即可)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@B ~]# cat /proc/sys/net/ipv4/ip_local_port_range 32768 61000[root@B ~]# cat /proc/sys/net/ipv4/tcp_timestamps 1[root@B ~]# cat /proc/sys/net/ipv4/tcp_tw_recycle 0[root@B ~]# cat /proc/sys/net/ipv4/tcp_tw_reuse 0[root@B ~]# echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse[root@B ~]# cat /proc/sys/net/ipv4/tcp_tw_reuse 1[root@B ~]# echo "10240 62000" > /proc/sys/net/ipv4/ip_local_port_range[root@B ~]# cat /proc/sys/net/ipv4/ip_local_port_range 10240 62000[root@B ~]# |
TIME_WAIT 优化注意事项的更多相关文章
- mssql sqlserver 优化注意事项:
摘要: 下文整理sqlserver优化中的常用知识点和注意事项 1.表上未建立合理的索引 2.服务器内存过小,导致缓存过少,数据库频繁的交互数据 3.统计信息不准确,导致索引乱用 4.网络异常,数据交 ...
- wap网站即手机端网页SEO优化注意事项及方法
定位和页面设计: 无论是PC端还是移动端,网站 都要考虑清楚消费群体的定位问题.虽然智能手机用户数量非常普及,但是要明白中国的大部分手机用户使用的还是2G网络,一直高 喊的3G.4G手机用户只有大约1 ...
- SQL优化注意事项
sql语句优化 性能不理想的系统中除了一部分是因为应用程序的负载确实超过了服务器的实际处理能力外,更多的是因为系统存在大量的SQL语句需要优化. 为了获得稳定的执行性能,SQL语句越简单越好.对复杂的 ...
- 关于mysql运行效率优化注意事项及要点
1. SQL优化的原则是:将一次操作须要读取的BLOCK数减到最低,即在最短的时间达到最大的数据吞吐量. 调整不良SQL通常能够从下面几点切入: ? 检查不良的SQL,考虑其写法是否还有可优化内容 ? ...
- SQL性能优化注意事项
1.选用适合的Oracle优化器 Oracle的优化器共有3种: a.RULE(基于规则) b.COST(基于成本) c.CHOOSE(选择性) 设置缺省的优化器,可以通过对init.ora文件中OP ...
- react 性能优化注意事项
工具: React 16 或更新版本 只需在url 后边加 ?react_perf 后 performance 一栏中会添加 User Timing devtool 分析 state.props ...
- TIME_WAIT 优化
·[场景描述] HTTP1.1之后,HTTP协议支持持久连接,也就是长连接,优点在于在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟. 如果我们使用了nginx去作为 ...
- MySql数据库索引优化注意事项
设计好MySql的索引可以让你的数据库飞起来,大大的提高数据库效率.设计MySql索引的时候有一下几点注意: 1,创建索引 对于查询占主要的应用来说,索引显得尤为重要.很多时候性能问题很简单的就是因为 ...
- PHP----------PHP自身的性能优化注意事项
1.如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍. 2.$row[’id’] 的速度是$row[id]的7倍. 3.echo 比 print 快,并且使用ech ...
随机推荐
- 思迈特软件Smartbi:传统BI被“革命”,AI是BI技术未来的发展趋势
根据IDC报告,2020年中国BI软件存量市场规模为38.2亿元,到2024年,市场规模将达到78.5亿元,未来4年整体市场年复合增长率(CAGR)为19.2%.此外,还有规模达到100亿元的增量市场 ...
- 设计模式学习笔记(详细) - 七大原则、UML类图、23种设计模式
目录 设计模式七大原则 UML类图 设计模式分类 单例模式 工厂设计模式 简单工厂模式 工厂方法模式(使用抽象类,多个is-a) 抽象工厂模式(使用接口,多个like-a) 原型模式 建造者模式 适配 ...
- Python:读取Excel表格时出现的u'\u51c6’ 无法正确显示汉字
读取Excel后,想显示其中一行的元素,结果读出来是这样[u'\u51c6\u8003\u8bc1\u53f7', u'\u8003\u751f\u59d3\u540d'],始终不显示正常的汉字 依照 ...
- 函数式编程 高阶函数 map&reduce filter sorted
函数式编程 纯函数:没有变量的函数 对于纯函数而言:只要输入确定,那么输出就是确定的.纯函数是没有副作用的. 函数式编程:允许把函数本身作为参数传入另一个函数,还允许返回一个函数 高阶函数:一个函数的 ...
- MySQL日常笔记第二讲
今日内容概要 存储引擎 MySQL的数据类型 约束条件 今日内容详细 存储引擎 """ 针对不同的数据可以有不同的存储方式 存储引擎就相当于针对数据采用不同的存储方式 & ...
- STP详解-STP、RSTP、MSTP
STP详解 01 冗余链路中存在的问题 如图所示LSW1和LSW2之间有两条线路相连,它们之间任何一条链路出现故障另外一条线路可以马上顶替出现故障的那条链路,这样可以很好的解决单链路故障引起的网络中断 ...
- supervisor启动报错
supervisor 启动失败报错 Error: Another program is already listening on a port that one of our HTTP servers ...
- java方法学习
java方法学习 方法概念 什么是方法 方法就是完成某些事情的过程,如:实现两个数相加,用方法add(数值1,数值2). 1.System.out.print(),System是系统的一个类,out是 ...
- 数据库常用的sql语句大全--sql
前言 本片博客使用mysql数据库进行数据操作,使用Navicat for mysql 这个IDE进行可视化操作.每个SQL语句都是亲身实验验证的,并且经过自己的思考的.能够保证sql语句的可运行性. ...
- (leetcode)二叉树的前序遍历-c语言实现
给定一个二叉树,返回它的 前序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 前序遍历 前序遍历首先 ...