Linuxでコネクション数が異常に増える原因と調査手順【ss・netstat完全活用】

  • URLをコピーしました!

Linuxサーバーで「通信が遅い」「突然接続できなくなる」「TIME_WAITが大量発生している」 といった症状が出た場合、根本原因として多いのが コネクション数の異常増加です。

本記事では、コネクション数が増える仕組みから、調査コマンド、原因特定、 実務で使える対処法までを体系的に解説します。

目次

Linuxにおけるコネクションとは

Linuxにおけるコネクションとは、TCP/UDPで確立された通信セッションを指します。 特にTCPでは以下の状態が存在します。

  • ESTABLISHED(通信中)
  • TIME_WAIT(通信終了待ち)
  • CLOSE_WAIT(相手終了待ち)
  • SYN_SENT / SYN_RECV(接続途中)

これらが異常に増加すると、OSリソースやエフェメラルポートを圧迫します。

コネクション数が増えすぎた時の症状

  • 新規通信が張れない
  • 外部APIやDB接続が失敗する
  • TIME_WAITが大量に残る
  • 再起動すると一時的に直る
  • アプリは正常だが通信だけおかしい

まず確認すべき基本指標

① 総コネクション数

ss -tan | wc -l

② 状態別コネクション数

ss -tan | awk '{print $1}' | sort | uniq -c | sort -nr

ここで特定の状態(TIME_WAIT / CLOSE_WAIT)が突出していないかを確認します。

状態別に見る異常増加の原因

TIME_WAITが多い場合

原因

  • 短命TCP通信の多発
  • KeepAlive未使用
  • 外部APIへの高頻度アクセス

確認コマンド

ss -tan state time-wait | wc -l

CLOSE_WAITが多い場合

原因

  • アプリがソケットをcloseしていない
  • バグ・接続リーク

確認コマンド

ss -tan state close-wait

CLOSE_WAITはほぼアプリ不具合です。

SYN_SENT / SYN_RECVが多い場合

原因

  • 接続先が応答しない
  • FW / NWで遮断されている
  • SYN Flood攻撃
ss -tan state syn-sent

どのプロセスが増やしているか特定する

PID単位で確認

ss -tanp

プロセス別集計

ss -tanp | awk '{print $NF}' | sort | uniq -c | sort -nr

特定のJavaプロセスやWebサーバーが突出していれば、そこが原因です。

宛先別に確認する

ss -tan | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr

特定の外部APIやDBに集中していないかを確認します。

よくある原因パターンまとめ

症状主な原因
TIME_WAIT大量短命TCP・KeepAlive未使用
CLOSE_WAIT大量アプリのclose漏れ
SYN_SENT大量NW遮断・接続先障害

一時的な回避策

TIME_WAIT再利用

sysctl -w net.ipv4.tcp_tw_reuse=1

ポート範囲拡張

sysctl -w net.ipv4.ip_local_port_range="10000 65535"

※ 根本解決ではありません

根本対策(最重要)

  • HTTP KeepAlive / HTTP2 を有効化
  • DB接続プール導入(HikariCP等)
  • 外部API呼び出し回数削減
  • 並列数・スレッド数制御

設計時に必ず見るべきポイント

  • 1秒あたりの新規接続数
  • 通信の寿命(短すぎないか)
  • NAT・FWを跨ぐか
  • エフェメラルポート上限

まとめ

Linuxのコネクション異常増加は、NW障害のように見えて アプリ設計が原因であることがほとんどです。

状態別に冷静に切り分けることで、数分で原因特定が可能になります。

TIME_WAIT・CLOSE_WAIT・SYN系を正しく見極めることが、 再発防止への最短ルートです。

目次