このトピックでは、Alibaba Cloud Linux 2 Elastic Compute Service (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 コマンドでは、Send-Q パラメーターは、リスニング TCP ソケットの syn backlog の最大サイズを示します。 Linux では、その戻り値は listening socket 上のすべての接続の最大キューサイズであり、0 にはなりません。
原因
tcp_diag モジュールは、カーネルバージョン kernel-4.19.43-13.al7.x86_64 以前には統合されていません。そのため、インスタンス上の ss コマンドは、/proc/net/tcp モードにフォールバックします。このモード (推奨されません) が使用されている場合、ss -lnt コマンド出力の listening TCP Socket の tx_queue 値は 0 になり、Send-Q 戻り値も 0 になります。
解決策
カーネルのアップグレードは、互換性と安定性の問題を引き起こす可能性があります。 Alibaba Cloud Linux 2 のリリースノート でカーネルの機能をよく理解し、カーネルバージョンをアップグレードする際には注意が必要です。
再起動操作により、インスタンスが短時間停止し、インスタンス上で実行されているサービスが中断され、データ損失が発生する可能性があります。そのため、インスタンスを再起動する前に、重要なインスタンスデータをバックアップすることをお勧めします。また、オフピーク時にインスタンスを再起動することをお勧めします。
tcp_diagモジュールを確認します。sudo lsmod | grep tcp_diagカーネルを最新バージョンにアップグレードします。
sudo yum update kernel新しいカーネルバージョンを有効にするために、インスタンスを再起動します。
sudo reboot