网络性能定位
根据tcp协议进行分析
目录
一、SYN_RECV阶段
1.1 确定半连接队列是否有丢包:
1.2 确定全连接队列是否有丢包现象
一、SYN_RECV阶段
内核在监听套接字的时候,在三次握手时,会创建两个队列,在服务器收到syn 包时,会创建半连接队列,并将这条握手未完成的连接 放到里面,然后回复ack,syn包给客户端,当客户端回复ack时,内核会将这条连接放到全连接队列里,调用accept就是将连接从全连接队列里取出。
如果半连接队列或者全连接队列满了,则可能发生丢包行为
1.1 确定半连接队列是否有丢包:
dmesg | grep "TCP: drop open request from"
半连接队列的连接数量也可以通过netstat命令统计SYN_RECV状态的连接得知。因为在3次握手时,收到syn包的连接的状态是SYN_RECV状态,而整个状态的持续时间是很短的,如果用netstat发现SYN_RECV状态的连接非常多,则说明半连接队列可能满了
netstat -ant|grep SYN_RECV|wc -l
半连接队列的大小由/proc/sys/net/ipv4/tcp_max_syn_backlog
控制,Linux的默认是1024。
当服务端发送SYN_ACK
后将会开启一个定时器,如果超时没有收到客户端的ACK
,将会重发SYN_ACK
包。重传的次数由/proc/sys/net/ipv4/tcp_synack_retries
控制,默认是5次。
1.2 确定全连接队列是否有丢包现象
netstat -s
netstat -s | egrep "listen|LISTEN"
// 全连接队列溢出次数
667399 times the listen queue of a socket overflowed
// 半连接队列溢出次数
667399 SYNs to LISTEN sockets dropped
ss -lnt
[root@mcs opt]# ss -lnt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 100 *:8080 *:*
在listen
状态下,Send-Q
表示全连接队列大小的最大值,Recv-Q
表示全连接队列的使用大小,超过最大值则会溢出。
应用进程处理包缓慢,持续小于 网卡的接包速度的话,将导致全连接队列很快就满了,导致丢包
参考:
TCP的全连接和半连接队列