论坛风格切换切换到宽版
  • 20阅读
  • 2回复

Linux上的TIME_WAIT和tcp_fin_timeout [复制链接]

上一主题 下一主题
离线北斗星
 

只看楼主 倒序阅读 使用道具 楼主   发表于: 2020-08-05
当Linux服务器的TIME_WAIT过多时,
通常会想到去修改参数降低TIME_WAIT时长,
以减少TIME_WAIT数量,但Linux并没有提供这样的接口,
除非重新编译内核。


Linux默认的TIME_WAIT时长一般是60秒,
定义在内核的include/net/tcp.h文件中:
#define TCP_TIMEWAIT_LEN (60*HZ)
/* how long to wait to destroy TIME-WAIT state,
* about 60 seconds
*/
#define TCP_FIN_TIMEOUT    TCP_TIMEWAIT_LEN
/* BSD style FIN_WAIT2 deadlock breaker.
* It used to be 3min, new value is 60sec,
* to combine FIN-WAIT-2 timeout with
* TIME-WAIT timer.
*/


注意tcp_fin_timeout不是TIME_WAIT时间:
# cat /proc/sys/net/ipv4/tcp_fin_timeout
60
tcp_fin_timeout实为FIN_WAIT_2状态的时长,
Linux没有提供修改TIME_WAIT时长接口,除非修改宏的定义重新编译内核。
但Windows可以修改注册表中的TcpTimedWaitDelay值来控制TIME_WAIT时长。


RTO:超时重传(Retransmission Timeout)


TIME_WAIT是一个常见经常的问题,相关内容(/etc/sysctl.conf或/proc/sys/net/ipv4):
1) net.ipv4.tcp_timestamps
   为1表示开启TCP时间戳,用来计算往返时间RTT(Round-Trip Time)和防止序列号回绕
2) net.ipv4.tcp_tw_reuse
   为1表示允许将TIME-WAIT的句柄重新用于新的TCP连接
3) net.ipv4.tcp_tw_recycle
   为1表示开启TCP连接中TIME-WAIT的快速回收,NAT环境可能导致DROP掉SYN包(回复RST)
4) net.ipv4.tcp_fin_timeout
   FIN_WAIT_2状态的超时时长
5) net.ipv4.tcp_syncookies
   为1时SYN Cookies,当SYN等待队列溢出时启用cookies来处理,可防范少量SYN攻击
6) net.ipv4.tcp_max_tw_buckets
   保持TIME_WAIT套接字的最大个数,超过这个数字TIME_WAIT套接字将立刻被清除并打印警告信息
7) net.ipv4.ip_local_port_range
8) net.ipv4.tcp_max_syn_backlog
   端口最大backlog内核限制,防止占用过大内核内存
9) net.ipv4.tcp_syn_retries
   对一个新建连接,内核要发送多少个SYN连接请求才决定放弃,不应该大于255
10) net.ipv4.tcp_retries1
   放弃回应一个TCP连接请求前﹐需要进行多少次重试,RFC规定最低的数值是3,这也是默认值
11) net.ipv4.tcp_retries2
   在丢弃激活(已建立通讯状况)的TCP连接之前﹐需要进行多少次重试,默认值为15
12) net.ipv4.tcp_synack_retries
   TCP三次握手的SYN/ACK阶段重试次数,缺省5


13) net.ipv4.tcp_max_orphans
   不属于任何进程(已经从进程上下文中删除)的sockets最大个数,超过这个值会被立即RESET,并同时显示警告信息
14) net.ipv4.tcp_orphan_retries
   孤儿sockets废弃前重试的次数,缺省值是7
15) net.ipv4.tcp_mem
   内核分配给TCP连接的内存,单位是page:
   第一个数字表示TCP使用的page少于此值时,内核不进行任何处理(干预),
   第二个数字表示TCP使用的page超过此值时,内核进入“memory pressure”压力模式,
   第三个数字表示TCP使用的page超过些值时,报“Out of socket memory”错误,TCP 连接将被拒绝
16) net.ipv4.tcp_rmem
   为每个TCP连接分配的读缓冲区内存大小,单位是byte
17) net.ipv4.tcp_wmem
   为每个TCP连接分配的写缓冲区内存大小,单位是byte:
   第一个数字表示,为TCP连接分配的最小内存,
   第二个数字表示,为TCP连接分配的缺省内存,
   第三个数字表示,为TCP连接分配的最大内存(net.core.wmem_max可覆盖该值)
18) net.ipv4.tcp_keepalive_time
   当keepalive起用的时候,TCP发送keepalive消息的频度,单位为秒,缺省是7200秒(即2小时)
19) net.ipv4.tcp_keepalive_intvl
   keepalive探测包的发送间隔    
20) net.ipv4.tcp_keepalive_probes
   如果对方不予应答,探测包的发送次数


代码中可通过SO_LINGER来控制。
离线北斗星

只看该作者 沙发   发表于: 2020-08-05
cat /proc/net/sockstat
sockets: used 294
TCP: inuse 35 orphan 0 tw 0 alloc 45 mem 1
UDP: inuse 13 mem 2
UDPLITE: inuse 0
RAW: inuse 4
FRAG: inuse 0 memory 0
sockets: used:已使用的所有协议套接字总量
TCP: inuse:正在使用(正在侦听)的TCP套接字数量。其值≤ netstat –lnt | grep ^tcp | wc –l
TCP: orphan:无主(不属于任何进程)的TCP连接数(无用、待销毁的TCP socket数)
TCP: tw:等待关闭的TCP连接数。其值等于netstat –ant | grep TIME_WAIT | wc –l
TCP:alloc(allocated):已分配(已建立、已申请到sk_buff)的TCP套接字数量。其值等于netstat –ant | grep ^tcp | wc –l
TCP:mem:套接字缓冲区使用量(单位不详。用scp实测,速度在4803.9kB/s时:其值=11,netstat –ant 中相应的22端口的Recv-Q=0,Send-Q≈400)
UDP:inuse:正在使用的UDP套接字数量
RAW:
FRAG:使用的IP段数量
离线北斗星

只看该作者 板凳   发表于: 2020-08-05
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1


net.ipv4.neigh.default.gc_stale_time=120


net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_announce=2
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1


net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0


kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1


kernel.msgmnb = 65536
kernel.msgmax = 65536


net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216


net.ipv4.tcp_max_orphans = 3276800


net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0

net.ipv4.tcp_synack_retries = 1


net.ipv4.tcp_syn_retries = 1


net.ipv4.tcp_tw_recycle = 1


net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
快速回复
限100 字节
如果您在写长篇帖子又不马上发表,建议存为草稿
 
上一个 下一个