[TimLinux] TCP全连接队列满

Posted TimLinux

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[TimLinux] TCP全连接队列满相关的知识,希望对你有一定的参考价值。

0. TCP三次握手

该图来自:TCP SOCKET中backlog参数的用途是什么?

 

syns queue: 半连接队列

accept queue: 全连接队列

控制参数存放在文件:/proc/sys/net/ipv4/tcp_abort_on_overflow中,0:表示如果三次握手第三步的时候全连接队列满了,那么server扔掉client发过来的ack(在server端因为全连接队列满了,认为连接还没有建立起来),1:表示第三步的时候如果全连接队列满了,server发送一个reset包给client,表示废掉这个握手过程和这个连接(client端会抛出异常:connection reset by peer的错误)

如果全连接队列满了并且tcp_abort_on_overflow=0的话,server过一段时间再次发送syn+ack给client(也就是重试),重试的次数在net.ipv4.tcp_synack_retries参数中配置:sysctl -a 可以查看当前的配置。

 

1. 查看全连接队列

$ netstat -s | egrep \'listen|LISTEN\'

667399 times the listen queue of a socket overflowed ==> 全连接队列满了 66739 次

$ ss -lnt   ==> 50: 表示监听的端口上全连接队列最大为50,第一列Recv-Q表示当前使用了多少

State      Recv-Q      Send-Q     local Address:Port          Peer Address:Port

LISTEN   0                50             :3306                             *:*

 

全连接队列的最大值 = min(backlog, somaxconn)

backlog: 是在socket创建的时候传入的,somaxconn:是一个os级别的系统参数(cat /proc/sys/net/core/somaxconn)

2. 查看半连接队列

半连接队列的大小取决于:max(64, /proc/sys/net/ivp4/tcp_max_syn_backlog),不同的OS会有差异

$ netstat -tn 

Active  Internet connections (w/o servers)

Proto  Recv-Q  Send-Q  Local Address  Foreign Address State

tcp0  0       server:8182 client-1:15260  SYNC_RECV

tcp0  28    server:22        client-1:51708  ESTABLISHED

tcp0  0     server:2376  client-1:60269  ESTABLISHED

这个命令显示的Recv-Q、Send-Q与全连接、半连接没有关系!

 

$ ab -n 10000 -c 300 http://172.16.218.128/3.php (ab: apache benchmark性能测试命令)

 

以上是关于[TimLinux] TCP全连接队列满的主要内容,如果未能解决你的问题,请参考以下文章

TCP 半连接队列和全连接队列满了会发生什么?又该如何应对?

TCP 半连接队列和全连接队列

性能分析之压测中 TCP 全连接队列占满问题分析及优化案例

你知道TCP的半连接与全连接队列吗?

TCP 半连接队列和全连接队列

TCP 半连接队列和全连接队列