一、三次握手环节比较关注的SYN_RCVD和ESTABLISHED
1、SYN_RCVD的半连接队列 max(64, /proc/sys/net/ipv4/tcp_max_syn_backlog)
cat /proc/sys/net/ipv4/tcp_max_syn_backlog
cat /etc/sysctl.conf
2、ESTABLISHED的全连接队列
全连接队列大小等于 min(backlog, /proc/sys/net/core/somaxconn) . backlog是在socket创建的时候传入的,somaxconn是os的一个参数
cat /proc/sys/net/core/somaxconn
如果全连接队列满了,那么客户端继续向服务端发送ACK,服务端的处理方式和系统参数tcp_abort_on_overflow有关,
Linux环境下可以通过执行"cat /proc/sys/net/ipv4/tcp_abort_on_overflow"来查看此参数
0表示字节丢弃该ACK 1表示发送一个RST给客户端,直接废掉这个握手过程与连接
3、通过ss查看Socket统计状态
ss -lnt 查看处于LISTEN状态的TCP套接字
4、队列溢出
ss -s 查看队列的溢出统计数据
backlog设置比较小的时候导致的溢出,这种情况从机器负载的监控或者观察中很难看出来.如果其他方面没有问题而吞吐一直上不去则可以使用如下命令查看是否是队列溢出了
date;netstat -s | egrep "listen|LISTEN"
短时间内溢出的数量有比较大的增长的情况下 , 调大backlog的值可以提升吞吐
二、四次挥手中, 比较关心的是TIME_WAIT状态
这个状态在高并发短连接的场景上也比较容易出问题. 原因是在于与客户端通信完成后,服务器端主动关闭连接 , TIME_WAIT状态要在2MSL的时间后才能转变成CLOSED状态,此时端口才能被回收.
而网络端口范围在0~65535的范围 . 高并发下 业务处理+传输数据的时间 远远小于 TIME_WAIT超时的时间,端口很快就会被消耗完.从这个角度看长连接可以比较少考虑这个状态的问题
netstat -nat|grep TIME_WAIT|awk '{print $4}'|sort|uniq -c|sort -nr|head -3