jxnxsdengyu
作者jxnxsdengyu2020-04-09 14:51
系统工程师, 江西农信

技术技巧---Socket监听队列

字数 2624阅读 1747评论 0赞 2

说明

UNIX类操作系统(含Linux和AIX)中,套接字监听(listen)均有排队机制,端口繁忙后应用处理速度不够时可能会出现等待甚至拒绝的情况。
AIX listen函数:

#include 
int listen ( Socket, Backlog)
int Socket, Backlog;

backlog即为队列深度参数。

检查方法

AIX系统

用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都不应该长时间大于零,否则需要分析原因。

Linux系统(RHEL)

用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 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广