linux time_wait 相关参数:
net.ipv4.tcp_tw_reuse = 0 表示开启重用。允许将time-wait sockets重新用于新的tcp连接,默认为0,表示关闭net.ipv4.tcp_tw_recycle = 0 表示开启tcp连接中time-wait sockets的快速回收,默认为0,表示关闭net.ipv4.tcp_fin_timeout = 60 表示如果套接字由本端要求关闭,这个参数决定了它保持在fin-wait-2状态的时间注意:
– 不像windows 可以修改注册表修改2msl 的值,linux 需要修改内核宏定义重新编译,tcp_fin_timeout 不是2msl 而是fin-wait-2状态超时时间.
– tcp_tw_reuse 和 so_reuseaddr 是两个完全不同的东西
so_reuseaddr 允许同时绑定 127.0.0.1 和 0.0.0.0 同一个端口; so_resuseport linux 3.7才支持,用于绑定相同ip:port,像nginx 那样 fork方式也能实现
1. tw_reuse,tw_recycle 必须在客户端和服务端 timestamps 开启时才管用(默认打开)2. tw_reuse?只对客户端起作用,开启后客户端在1s内回收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 会有一点点好处;
4. 业务上也可以设计由服务端主动关闭连接。
对于服务端
1. 打开tw_reuse无效
2. 线上环境tw_recycle不建议打开
服务器处于nat 负载后,或者客户端处于nat后(基本公司家庭网络基本都走nat);
公网服务打开就可能造成部分连接失败,内网的话到时可以视情况打开;
像我所在公司对外服务都放在负载后面,负载会把 timestamp 都给清空,就算你打开也不起作用。
3. 服务器time_wait高怎么办
不像客户端有端口限制,处理大量time_wait linux已经优化很好了,每个处于time_wait 状态下连接内存消耗很少,
而且也能通过tcp_max_tw_buckets =262144配置最大上限,现代机器一般也不缺这点内存。
下面像我们一台每秒峰值1w请求的 http 短连接服务,长期处于tw_buckets 溢出状态,
tw_socket_tcp 占用70m, 因为业务简单服务占用cpu 200% 运行很稳定。
slabtop 262230 251461 ?95% ? ?0.25k ?17482 ? ? ? 15 ? ? 69928k tw_sock_tcp ss -s total: 259 (kernel 494) tcp: 262419 (estab 113, closed 262143, orphaned 156, synrecv 0, timewait 262143/0), ports 80 transport total ip ipv6 494 - - raw 1 1 0 udp 0 0 0 tcp 276 276 0 inet 277 277 0 frag 0 0 0 唯一不爽的就是:
系统日志中overflow 错误一直再刷屏,也许该buckets 调大一下了
tcp: time wait bucket table overflow
tcp: time wait bucket table overflow
tcp: time wait bucket table overflow
tcp: time wait bucket table overflow
tcp: time wait bucket table overflow
5. 业务上也可以设计由客户端主动关闭连接
原理分析
1. msl 由来
发起连接关闭方回复最后一个fin 的ack,为避免对方ack 收不到、重发的或还在中间路由上的fin 把新连接给丢掉了,等个2msl(linux 默认2min)。
也就是连接有谁关闭的那一方有time_wait问题,被关那方无此问题。
2. reuse、recycle
通过timestamp的递增性来区分是否新连接,新连接的timestamp更大,那么保证小的timestamp的 fin 不会fin掉新连接,不用等2msl。
3. reuse
通过timestamp 递增性,客户端、服务器能够处理outofbind fin包
4. recycle
? ? 对于服务端,同一个src ip,可能会是nat后很多机器,这些机器timestamp递增性无可保证,服务器会拒绝非递增请求连接。
无法显示请看下提交工单的电脑是相关网址购买域名一定要实名认证吗学会这几招 轻松做好自媒体长城宽带访问很慢能切换一下别的线路我试试吗虚拟主机和云服务器近期价格对比阿里云学生服务器代买怎样通过域名查ip我买了阿里云的服务器