服务器tcp连接timewait过多优化及详细分析

本文涉及的产品
公网NAT网关,每月750个小时 15CU
简介:

【背景说明】

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

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

【优化效果】

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

wKiom1Ty5IfhAB9FAAEI5rK5xCU064.jpg

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

wKioL1Ty5aOCeWn5AAEKHpcJW_c047.jpg

【具体优化方案】

注意:前端使用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生效

【方案详细介绍】

1
net.ipv4.tcp_tw_reuse = 1

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

1
net.ipv4.tcp_tw_recycle = 1

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

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

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

如果服务器身处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,所以激活这一规则,也不会有问题。我们这里能使用这个策略,最大的原因也是在这里。

1
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连接的断开,可参考以下状态机:

wKiom1Ty5LmjaqrnAAHQ0NimpRk554.jpg

【补充说明】

如果变更后运行命令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参数(风险很大)。

wKiom1Ty5J6j_VO0AACyl62w9hk303.jpg

【总结】

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

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

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

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



本文转自 msj0905 51CTO博客,原文链接:http://blog.51cto.com/sky66/1689212

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
1月前
|
存储 缓存 前端开发
如何优化 SSR 应用以减少服务器压力
优化SSR应用以减少服务器压力,可采用代码分割、缓存策略、数据预加载、服务端性能优化、使用CDN、SSR与SSG结合、限制并发请求、SSR与CSR平滑切换、优化前端资源及利用框架特性等策略。这些方法能有效提升性能和稳定性,同时保证用户体验。
|
2月前
|
域名解析 网络协议 数据库
TCP/IP服务器
【10月更文挑战第20天】TCP/IP服务器
124 65
|
1月前
|
监控 PHP Apache
优化 PHP-FPM 参数配置:实现服务器性能提升
优化PHP-FPM的参数配置可以显著提高服务器的性能和稳定性。通过合理设置 `pm.max_children`、`pm.start_servers`、`pm.min_spare_servers`、`pm.max_spare_servers`和 `pm.max_requests`等参数,并结合监控和调优措施,可以有效应对高并发和负载波动,确保Web应用程序的高效运行。希望本文提供的优化建议和配置示例能够帮助您实现服务器性能的提升。
62 3
|
2月前
|
存储 缓存 前端开发
如何优化 SSR 应用以减少服务器压力?
如何优化 SSR 应用以减少服务器压力?
|
2月前
|
机器学习/深度学习 弹性计算 缓存
阿里云服务器经济型e实例与通用算力型u1实例对比分析与选择指南
在阿里云服务器的实例规格中,经济型e实例和通用算力型u1实例是很多个人和普通企业级用户常见的选择,经济型e实例与通用算力型u1实例的主要区别在于性能、应用场景及价格策略。本文将详细对比这两种实例的性能、应用场景及价格策略,以供参考。
|
2月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
2月前
|
IDE 网络安全 开发工具
IDE之vscode:连接远程服务器代码(亲测OK),与pycharm链接服务器做对比(亲自使用过了),打开文件夹后切换文件夹。
本文介绍了如何使用VS Code通过Remote-SSH插件连接远程服务器进行代码开发,并与PyCharm进行了对比。作者认为VS Code在连接和配置多个服务器时更为简单,推荐使用VS Code。文章详细说明了VS Code的安装、远程插件安装、SSH配置文件编写、服务器连接以及如何在连接后切换文件夹。此外,还提供了使用密钥进行免密登录的方法和解决权限问题的步骤。
834 0
IDE之vscode:连接远程服务器代码(亲测OK),与pycharm链接服务器做对比(亲自使用过了),打开文件夹后切换文件夹。
|
2月前
|
IDE 网络安全 开发工具
IDE之pycharm:专业版本连接远程服务器代码,并配置远程python环境解释器(亲测OK)。
本文介绍了如何在PyCharm专业版中连接远程服务器并配置远程Python环境解释器,以便在服务器上运行代码。
431 0
IDE之pycharm:专业版本连接远程服务器代码,并配置远程python环境解释器(亲测OK)。
|
2月前
|
人工智能 运维 Kubernetes
87cloud案例分析:阿里云国际服务器如何支持在线教育
87cloud案例分析:阿里云国际服务器如何支持在线教育
|
2月前
|
弹性计算 安全 Linux
阿里云国际版ECS云服务器ping不通的原因分析
阿里云国际版ECS云服务器ping不通的原因分析