Alibaba Cloud Linux 2系统的ECS实例执行ss命令时返回的Send-Q字段值为0,如何处理?

本文为您介绍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及之后的版本。