TCP/IP(七)TCP的连接管理(四)全连接

一 全连接队列

nginx listen 参数backlog的意义 nginx配置文件中listen后面的backlog配置

① TCP全连接队列概念

bash 复制代码
全连接队列: 也称 'accept' 队列

② 查看应用程序的 TCP 全连接队列大小

bash 复制代码
实验1:  ss 命令查看 'LISTEN状态'下 'Recv-Q/Send-Q' 含义

附加:   8080端口是'nginx'监听的

备注:   全连接队列一般'所处'在服务端

补充:   Recv-Q  接收队列,'一般为0',如果'不是0',表示队列'正在堆积'
bash 复制代码
实验2:  ss 命令查看 '非 LISTEN状态'下 'Recv-Q/Send-Q' 含义

强调:   ss 命令加不加'l'参数,'Recv-Q/Send-Q' 含义'不同'
bash 复制代码
补充: netstat 命令的 'l'参数同上

-p:  显示'进程名/程序名'

③ ab 模拟 TCP 全连接队列溢出

bash 复制代码
1、'ab' 简介
bash 复制代码
2、客户端执行 'ab' 命令对服务端发起'压力'测试
bash 复制代码
场景:有时设置'并发参数较大'时,'10000+'执行命令时会报如下'错误'

apr_socket_recv: Connection reset by peer (104)报错 ab -r 参数也可以解决报错

bash 复制代码
3、压测'结果'

备注: 关于'ss'的观察结果这里不再赘述,我们在'wrk'测试中观察

④ wrk模拟 TCP 全连接队列溢出

bash 复制代码
模拟测试中'环境'内核参数:

  1、somaxconn 是默认值 128

  2、nginx 的 backlog 是默认值 511

wrk安装和使用

bash 复制代码
1、客户端执行 'wrk' 命令对服务端发起'压力测试',并发 '3 万' 个连接

wrk -t 6 -c 30000 -d 60s http://192.168.3.200:8088
bash 复制代码
2、在'服务端'可以使用 'ss' 命令,来查看当前 TCP '全连接队列'的情况

建议: watch -n1 "ss -lnt| grep 8088" 实时观察
bash 复制代码
3、查看 'TCP 最大全连接队列' 溢出情况

watch -n1 'netstat -s | grep overflowed'

⑤ linux中 TCP全连接队列满了使用什么策略来回应客户端

bash 复制代码
内核参数: /proc/sys/net/ipv4/tcp_abort_on_overflow

备注: 默认就是'0',直接'drop'丢弃

补充: 置为'1'会在'全连接队列'满了的场景,服务端触发'RST'
bash 复制代码
排查: 户端'连接不上'服务端,'是不是'服务端 TCP 全连接队列满的'原因'?

tcp_abort_on_overflow 1 --> 'connection reset by peer' --> '全连接队列溢出'

⑥ 如何增大 TCP 全连接队

bash 复制代码
TCP 全连接队列的'最大值' = min(somaxconn, backlog)

细节:同一操作系统somaxconn在'物理机'和'虚拟机'默认值'不一样'

注意:这里'somaxconn'和'backlog'的具体含义
bash 复制代码
案例: 增加nginx中'全连接队列'的最大值

1、'默认'的初始状态
bash 复制代码
2、增加'net.core.somaxconn'内核参数值
bash 复制代码
3、同时增加 nginx 'listen 指令的' backlog 参数,也同样设置成 '5000'
bash 复制代码
4、重启完后 nginx 服务后,'服务端执行 ss 命令',观察 TCP '全连接队列'大小
bash 复制代码
5、继续'探究' --> 增大 TCP 全连接队列为'5000'后,继续'压测'

说明: 客户端同样以 '3 万个连接' 并发发送请求给服务端
bash 复制代码
6、对'上述结果'分析

重点: 查看'TCP全连接队列'是否溢出

⑦ TCP连接失败排查

netstat -s TCP连接失败 相关统计 解释

netstat -s 输出解释