【性能调优】:关于压测短链接,出现大量time_wait的情况分析

一台负载机可用的本地端口有3w多个,如果每个端口回收的默认值是60s的话,单台机器压测的理论阈值就是500左右;

同时观察到cpu这个时候主要费在sy上,

 

us:用户占用cpu

sy:系统占用cpu

ni: 用户进程空间内改变过优先级进程站cpu

id:空闲cpu

wa:等待io的cpu时间

hi:硬件中断

si:软件中断

通过perf top看到内核态寻找可用的Local Port消耗了比较多的CPU:

 注意图中ipv6_rcv_saddr_equal和inet_csk_get_port 总共比较高的CPU

sy占用了30-50%的CPU,这太不科学了,同时通过 netstat 分析连接状态,确实看到很多TIME_WAIT:

于是让PE修改了tcp相关参数:降低 tcp_max_tw_buckets和开启tcp_tw_reuse,性能提升明显。

网页协议的默认配置可以在/proc/sys/net/ipv4/下查看,其中与TCP协议栈相关的配置项均以tcp_xxx命名,

输出本台机器的ip配置信息:

cat /proc/sys/net/ipv4/ip_local_port_range      32768   61000
cat /proc/sys/net/ipv4/tcp_max_syn_backlog      1024
cat /proc/sys/net/ipv4/tcp_syn_retries          5
cat /proc/sys/net/ipv4/tcp_max_tw_buckets       180000
cat /proc/sys/net/ipv4/tcp_tw_recycle           0
cat /proc/sys/net/ipv4/tcp_tw_reuse             0

  可以看到默认端口可用的接近3w个,

对一下几个参数分别说明下:

tcp_max_tw_buckets:系统同时持有的最大的time_wait状态下的连接,超过这个数后time_wait直接被销毁,默认配置是为了简单防范ddos攻击的,可以适当调大,但绝对不应调小;

tcp_tw_recycle:用于快速回收处于TIME_WAIT状态的socket以便重新分配。默认是关闭的。

tcp_tw_reuse:开启该选项后,kernel会复用处于TIME_WAIT状态的socket。

网络问题定位思路:

收到无法建立连接的log信息后,用netstat -at | grep “TIME_WAIT”统计,可以查看处于timewait状态的端口信息,

进而查看端口信息,tcp_max_tw_buckets默认值为18w,而ip_local_port_range范围不到3w,大量的TIME_WAIT状态使得local port在TIME_WAIT持续期间不能被再次分配,即没有可用的local port,这将是导致新建连接失败的最大原因

当然,无法建立连接,也可能是因为黑名单的问题,具体问题具体分析。

问题解决方法:

1,修改ip信息的系统配置,增加tcp_max_tw_buckets的值,同时开启tcp_tw_recycle和tcp_tw_reuse,在shell终端输入命令”echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle”可以开启该配置。

其实TIME_WAIT状态的socket是否被快速回收是由tcp_tw_recycle和tcp_timestamps两个配置项共同决定的,只不过由于tcp_timestamps默认就是开启的,故大多数文章只提到设置tcp_tw_recycle为1。

2,修改应用程序:

将TCP短连接改造为长连接。通常情况下,如果发起连接的目标也是自己可控制的服务器时,它们自己的TCP通信最好采用长连接,避免大量TCP短连接每次建立/释放产生的各种开销;如果建立连接的目标是不受自己控制的机器时,能否使用长连接就需要考虑对方机器是否支持长连接方式了。

 

posted @ 2019-10-25 10:26  fy-  阅读(1493)  评论(0)    收藏  举报