一 全连接队列
nginx listen 参数backlog的意义 nginx配置文件中listen后面的backlog配置
① TCP全连接队列概念
全连接队列: 也称 'accept' 队列
② 查看应用程序的 TCP 全连接队列大小
实验1: ss 命令查看 'LISTEN状态'下 'Recv-Q/Send-Q' 含义
附加: 8080端口是'nginx'监听的
备注: 全连接队列一般'所处'在服务端
补充: Recv-Q 接收队列,'一般为0',如果'不是0',表示队列'正在堆积'
实验2: ss 命令查看 '非 LISTEN状态'下 'Recv-Q/Send-Q' 含义
强调: ss 命令加不加'l'参数,'Recv-Q/Send-Q' 含义'不同'
补充: netstat 命令的 'l'参数同上
-p: 显示'进程名/程序名'
③ ab 模拟 TCP 全连接队列溢出
1、'ab' 简介
2、客户端执行 'ab' 命令对服务端发起'压力'测试
场景:有时设置'并发参数较大'时,'10000+'执行命令时会报如下'错误'
apr_socket_recv: Connection reset by peer (104)报错 ab -r 参数也可以解决报错
3、压测'结果'
备注: 关于'ss'的观察结果这里不再赘述,我们在'wrk'测试中观察
④ wrk模拟 TCP 全连接队列溢出
模拟测试中'环境'内核参数:
1、somaxconn 是默认值 128
2、nginx 的 backlog 是默认值 511
wrk安装和使用
1、客户端执行 'wrk' 命令对服务端发起'压力测试',并发 '3 万' 个连接
wrk -t 6 -c 30000 -d 60s http://192.168.3.200:8088
2、在'服务端'可以使用 'ss' 命令,来查看当前 TCP '全连接队列'的情况
建议: watch -n1 "ss -lnt| grep 8088" 实时观察
3、查看 'TCP 最大全连接队列' 溢出情况
watch -n1 'netstat -s | grep overflowed'
⑤ linux中 TCP全连接队列满了使用什么策略来回应客户端
内核参数: /proc/sys/net/ipv4/tcp_abort_on_overflow
备注: 默认就是'0',直接'drop'丢弃
补充: 置为'1'会在'全连接队列'满了的场景,服务端触发'RST'
排查: 户端'连接不上'服务端,'是不是'服务端 TCP 全连接队列满的'原因'?
tcp_abort_on_overflow 1 --> 'connection reset by peer' --> '全连接队列溢出'
⑥ 如何增大 TCP 全连接队
TCP 全连接队列的'最大值' = min(somaxconn, backlog)
细节:同一操作系统somaxconn在'物理机'和'虚拟机'默认值'不一样'
注意:这里'somaxconn'和'backlog'的具体含义
案例: 增加nginx中'全连接队列'的最大值
1、'默认'的初始状态
2、增加'net.core.somaxconn'内核参数值
3、同时增加 nginx 'listen 指令的' backlog 参数,也同样设置成 '5000'
4、重启完后 nginx 服务后,'服务端执行 ss 命令',观察 TCP '全连接队列'大小
5、继续'探究' --> 增大 TCP 全连接队列为'5000'后,继续'压测'
说明: 客户端同样以 '3 万个连接' 并发发送请求给服务端
6、对'上述结果'分析
重点: 查看'TCP全连接队列'是否溢出
⑦ TCP连接失败排查
netstat -s TCP连接失败 相关统计 解释
netstat -s 输出解释