UNIX类操作系统(含Linux和AIX)中,套接字监听(listen)均有排队机制,端口繁忙后应用处理速度不够时可能会出现等待甚至拒绝的情况。
AIX listen函数:
#include
int listen ( Socket, Backlog)
int Socket, Backlog;
backlog即为队列深度参数。
用netstat命令检查:
netstat -aon
Active Internet connections (including servers)
Proto Recv-Q Send-Q Local Address Foreign Address (state)
tcp4 0 0 *.13 *.* LISTEN
so_options: (ACCEPTCONN|REUSEADDR)
q0len:0 qlen:0 qlimit:1000 so_state: (PRIV)
timeo:0 uid:0
so_special: (LOCKABLE|MEMCOMPRESS|DISABLE)
so_special2: (PROC)
sndbuf:
hiwat:16384 lowat:4096 mbcnt:0 mbmax:65536
rcvbuf:
hiwat:16384 lowat:1 mbcnt:0 mbmax:65536
sb_flags: (SEL|NOTIFY)
TCP:
mss:1448 flags: (RFC1323|COPYFLAGS)
qlimit为监听队列长度阀值(等于backlog值)
qlen为已完成TCP三次握手,应用程序未接受(accept)的连接数量
q0len为已经开始,但尚未完成TCP三次握手的连接数量
实际上,在常见系统实现中,socket监听队列实际深度并不是backlog,而是1.5倍的backlog值。在正常的系统中,qlen和q0len都不应该长时间大于零,否则需要分析原因。
用ss命令检查:
[virtuser@architecture ~]$ ss -an
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 32 *:21 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 128 *:22 *:*
LISTEN 0 50 *:3306 *:*
LISTEN 0 128 :::80 :::*
Send-Q为监听队列长度阀值(等于backlog值)
Recv-Q为TCP连接已建立,但应用程序未接受(accept)的连接数量
判断标准和AIX一致,Recv-Q不应该长时间大于零。
AIX查看网络拥塞丢包数量
netstat -p tcp | grep "discarded due to listener\'s queue full"
网络拥塞的原因很多,有时因为请求方向服务方创建socket连接并发过大导致拥塞,拒绝连接,这种情况可以通过抓包分析(只捕获TCP SYN包):tcp -i "tcp[tcpflags]&(tcp-syn)!=0"
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞2
添加新评论0 条评论