详情页标题前

腾讯云负载均衡客户端 timewait 过多解决方案

详情页1

本文背景

客户压测 CLB 时,常会遇到一些客户端 timewait 过多,端口被快速占满,导致 connect 失败的问题,下面会说明原因和解决方案。

Linux 参数介绍

tcp_timestamps:是否开启 tcp timestamps 选项,timestamps 是在 tcp 三次握手过程中协商的,任意一方不支持,该连接就不会使用 timestamps 选项。
tcp_tw_recycle:是否开启 tcp time_wait 状态回收。
tcp_tw_reuse:开启后,可直接回收超过1s的 time_wait 状态的连接。

原因分析

客户端 timewait 太多,是因为客户端主动断开连接,客户端每断开一个连接,该连接都会进入 timewait 状态,默认60s超时回收。一般情况下,遇到这种场景时,客户会选择打开 tcp_tw_recycletcp_tw_reuse 两个参数,便于回收timewait状态连接。
然而当前 CLB 没有打开
tcp_timestamps 选项,导致客户端打开的 tcp_tw_recycletcp_tw_reuse 都不会生效,不能快速回收 timewait 状态连接。下面会解释几个 Linux 参数的含义和 CLB 不能开启 tcp_timestamps 的原因。1. tcp_tw_recycle 和 tcp_tw_reuse只有在 tcp_timestamps 打开时才会生效。2. 在 FullNAT 场景下,tcp_timestamps和tcp_tw_recycle是不能同时打开的,因为公网客户端经过 NAT 网关访问服务器,会存在问题,原因如下:
tcp_tw_recycle/tcp_timestamps 都开启的条件下,60s内同一源 IP 主机的 socket connect 请求中的 timestamp 必须是递增的。以2.6.32内核为例,具体实现如下:

if(tmp_opt.saw_tstamp && tcp_death_row.sysctl_tw_recycle &&(dst = inet_csk_route_req(sk,req))!= NULL && (peer = rt_get_peer((struct rtable *)dst))!= NULL &&  peer->v4daddr == saddr){ if(get_seconds()< peer->tcp_ts_stamp + TCP_PAWS_MSL &&     (s32)(peer->tcp_ts - req->ts_recent) > TCP_PAWS_WINDOW){         NET_INC_STATS_BH(sock_net(sk),LINUX_MIB_PAWSPASSIVEREJECTED)         goto ↓drop_and_release; }}

说明:tmp_opt.saw_tstamp:该 socket 支持 tcp_timestamp。
sysctl_tw_recycle:本机系统开启 tcp_tw_recycle 选项。
TCP_PAWS_MSL:60s,该条件判断表示该源 IP 的上次 tcp 通讯发生在60s内。
TCP_PAWS_WINDOW:1,该条件判断表示该源 IP 的上次 tcp 通讯的 timestamp 大于本次 tcp。
3. CLB(7层)关闭了 tcp_timestamps 原因,因为公网客户端经过 NAT 网关访问服务器,可能会存在问题,如下例:3.1 某五元组还是 time_wait 状态。NAT网关对端口的分配策略,2MSL内复用了同个五元组,发来syn包。3.2 在开启 tcp_timestamps 情况下,同时满足如下两个条件,会丢弃该 syn 包(因为开启了时间戳选项,认为是老包)。3.2.1 上次时间戳 > 本次时间戳。3.2.2 24天内收过包(时间戳字段是32位,Linux 默认1ms更新一次时间戳,24天会发生时间戳回绕)。说明:在移动端该问题更为明显,因为客户端都是在运营商NAT网关下面共享有限的公网 IP,五元组还可能在2MSL内被复用,不同客户端传来的时间戳不能保证是递增的。以2.6.32内核为例,具体实现如下:

static inline int tcp_paws_check(const struct tcp_options_received *rx_opt,int paws_win){ if((s32)(rx_opt->ts_recent - rx_opt->rcv_tsval)<= paws_win) return 1; if(unlikely(get_seconds()>=rx_opt->ts_recent_stamp + TCP_PAWS_24DAYS)) return 1; return 0;}

说明:rx_opt->ts_recent:上次的时间戳。
rx_opt->rcv_tsval:本次收到的时间戳。
get_seconds():当前时间。
rx_opt->ts_recent_stamp:上次收到包的时间。

解决方案

客户端 Timewait 过多问题,有如下解决方案:HTTP 使用短连接(Connection: close),这时由 CLB 主动关闭连接,客户端不会产生 timewait。如果场景需要使用长连接,可以打开 socket 的 SO_LINGER 选项,使用 rst 关闭连接,避免进入 timewait 状态,达到快速回收端口的目的。
负载均衡官网1折活动,限时活动,即将结束,速速收藏
同尘科技为腾讯云授权服务中心。
购买腾讯云产品享受折上折,更有现金返利。同意关联立享优惠

转转请注明出处:https://www.yunxiaoer.com/139880.html

(0)
上一篇 2023年12月9日 上午1:08
下一篇 2023年12月9日 上午1:08
详情页2

相关推荐

  • 腾讯云高性能计算集群实例售卖地域

    高性能计算集群实例可售卖地域如下表: 实例族 类型 机型 GPU 型号 地域 高性能计算集群 GPU 型 HCCPNV5 NVIDIA H800 上海   HCCPNV5v NVIDIA H800 北京、上海、南京   HCCPNV4sne NVIDIA A800 上海   HCCPNV4sn NVIDIA A800 广州   HCCPNV4…

    腾讯云 2023年12月9日
  • 腾讯云对象存储对象访问 URL

    简介 本文档提供获取已上传到存储的对象访问 URL 的代码示例。 获取对象访问 URL 功能说明 查询对象访问的 URL,该接口不会判断对象是否真实存在。说明如何使生成的对象 URL 在浏览器中打开是预览,而不是下载:在获取的 URL 后拼接参数 response-content-disposition=inline。如何使生成的对象 URL 在浏览器中打开…

    腾讯云 2023年12月9日
  • 阿里云负载均衡释放负载均衡实例-云淘科技

    您可以根据需要删除CLB实例,避免不必要的计费。删除CLB实例不会删除后端ECS,也不会影响后端ECS的运行。 前提条件 在释放CLB实例前,确保您已经关闭了删除保护开关。 背景信息 释放CLB实例前,您需要了解以下信息:警告 如果您已经将一个域名解析至CLB实例的公网服务地址,在释放CLB实例之前,建议先将该自定义域名解析至另外一个负载均衡实例,避免业务中…

    2023年12月10日
  • 信息流广告,信息流部分建议宽度830px,只针对默认列表样式,顺序随机
  • 腾讯云Serverless应用中心通过命令行完成框架部署-同尘科技

    除了控制台之外,您也可以通过命令行快速部署 Web 框架,本篇文档将具体为您介绍,如何通过 Serverless Cloud Framework 的 HTTP 组件,完成 Web 应用的本地部署。 前提条件 已开通服务并完成 Serverless Cloud Framework 的 权限配置。 支持框架 支持框架 相关文档 Express 快速部署 Expr…

    腾讯云 2023年12月9日
  • 腾讯云对象存储上传下载或拷贝文件 – cp

    cp 命令用于上传、下载或拷贝文件。 命令格式 ./coscli cp [flags] cp 命令包含以下参数: 参数格式 参数用途 示例 source_path 源文件路径。可以为本地路径或 COS 文件路径。COS路径支持使用 配置参数 中的桶别名,或桶名称进行访问。如使用桶名称访问,需要额外携带 endpoint flag 本地路径:~/example…

    腾讯云 2023年12月9日

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
本站为广大会员提供阿里云、腾讯云、华为云、百度云等一线大厂的购买,续费优惠,保证底价,买贵退差。