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及之前的版本。

  • 内核:4.19.43-13.al7.x86_64及之前的内核版本。您可以通过uname -r命令来查看内核版本。

系统显示类似如下。

# 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字段表示该Socketsyn backlog最大值。在Linux系统中,该字段实际输出该listening Socket全连接队列的最大容量,所以其值不应该为0。

问题原因

kernel-4.19.43-13.al7.x86_64及之前版本的内核未集成tcp_diag模块,因此ss命令会回退到/proc/net/tcp模式。使用/proc/net/tcp模式(不推荐使用)时,输出结果中listening TCP Sockettx_queue字段值均为0,导致ss -lnt命令输出的Send-Q字段值也为0

解决方案

警告
  • 升级内核可能会出现兼容性和稳定性问题,建议您查看Alibaba Cloud Linux 2镜像发布记录了解具体内核功能后谨慎进行操作。

  • 重启实例将导致您的实例暂停运行,这可能引发业务中断和数据丢失。因此,建议您在执行此操作之前备份关键数据,并选择在非业务高峰期进行。

  1. 执行以下命令,确认没有查询到tcp_dial模块。

    sudo lsmod | grep tcp_diag
  2. 执行以下命令,升级内核到最新版本。

    sudo yum update kernel
  3. 执行以下命令,重启实例使配置生效。

    sudo reboot