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