本文为您介绍Alibaba Cloud Linux 2系统的ECS实例执行ss命令时返回的Send-Q字段值为0的原因及解决方案。
问题描述
在符合如下条件的ECS实例中执行ss -lnt
命令时,返回的Send-Q字段值为0。
镜像:
aliyun-2.1903-x64-20G-alibase-20190507.vhd
及之前的版本。内核:
kernel-4.19.43-13.al7.x86_64
及之前的内核版本。
系统显示类似如下。
# ss -lnt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 0 *:35107 *:*
LISTEN 0 0 *:38727 *:*
LISTEN 0 0 *:5355 *:*
LISTEN 0 0 *:111 *:*
而查看ss命令的说明会发现,对于监听中(listening)的TCP socket,Send-Q字段表示该Socket的syn backlog最大值。在Linux系统中,该字段实际输出该listening socket全连接队列的最大容量,所以其值不应该为0。
Send-Q
Established: The count of bytes not acknowledged by the remote host.
Listening: Since Kernel 2.6.18 this column contains the maximum
size of the syn backlog.
问题原因
kernel-4.19.43-13.al7.x86_64
及之前的内核版本未集成tcp_diag模块,因此ss命令会回退到/proc/net/tcp
模式,而/proc/net/tcp
接口(不推荐使用)输出结果中listening TCP socket的tx_queue字段值均为0,从而导致ss -lnt
命令输出的Send-Q字段值也为0。详情可参见/proc/net/tcp接口介绍文档。
ss -lnt
命令输出的Send-Q字段表示listening TCP socket全连接队列的最大容量。用户态network相关的工具套件有net-tools与iproute2两种,其中net-tools自2001年已经停止维护,取而代之的是iproute2套件。而ss命令正是iproute2套件的一部分,net-tools中与ss实现类似功能的则是netstat命令。ss命令与netstat命令获取网络信息的区别如下:
netstat通过
/proc/net/tcp
接口获取TCP socket的相关统计信息。ss默认使用socket接口与tcp_diag内核模块通讯,获取TCP socket的相关统计信息。当内核不支持tcp_diag内核模块时,会回退到
/proc/net/tcp
模式。
解决方案
升级ECS实例的内核到kernel-4.19.43-13.1.al7.x86_64
及之后的版本。