LinuxでTCP接続数が増え続ける原因と対策【調査から設計改善まで】

  • URLをコピーしました!

Linuxサーバーを運用していると、 「TCP接続数が時間とともに増え続け、減らない」 という現象に遭遇することがあります。

この状態を放置すると、

  • 通信遅延
  • エフェメラルポート枯渇
  • アプリケーション停止

といった重大障害につながります。

本記事では、TCP接続数が増え続ける原因を OS視点・アプリ視点の両方から整理し、 正しい調査手順と対策を解説します。

目次

TCP接続数が増え続けるとはどういう状態か

以下のような状態を指します。

  • ESTABLISHED が減らない
  • TIME_WAIT / CLOSE_WAIT が増加し続ける
  • 再起動しない限り回復しない

まず確認すべきコマンド

現在のTCP状態別接続数

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

ポート別接続数

ss -ant '( sport = :80 )' | wc -l

原因① TIME_WAITが大量発生している

概要

短命TCP接続が大量に発生している。

典型例

  • HTTP KeepAlive 無効
  • APIを毎回新規接続

対策

  • KeepAlive有効化
  • コネクションプール導入

原因② CLOSE_WAITが増え続ける

概要

アプリケーションが socket close を呼んでいない。

確認

ss -ant | grep CLOSE-WAIT

対策

  • アプリ側の修正
  • ライブラリ更新

※ OS側では解決できません。

原因③ アプリのコネクションリーク

概要

接続を使い回さず作りっぱなし。

典型例

  • DB接続リーク
  • HTTPクライアント誤使用

対策

  • 接続数制限
  • プール設定見直し

原因④ エフェメラルポート枯渇

概要

TIME_WAITが多すぎて新規接続不可。

確認

cat /proc/sys/net/ipv4/ip_local_port_range

対策

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

原因⑤ 負荷分散設計の問題

概要

LB配下で接続が偏る。

対策

  • KeepAlive調整
  • LB設定見直し

OSチューニングでやってよいこと・悪いこと

やってよい

  • ポート範囲拡張
  • reuse設定

やってはいけない

  • 根本原因を無視
  • timeout極端短縮

障害対応時の切り分けフロー

  1. 状態別接続数確認
  2. 増えている状態を特定
  3. アプリ or OS 切り分け
  4. 設計レベルで対策

まとめ

TCP接続数が増え続ける問題は、 「OSの問題ではなく設計の問題」であることがほとんどです。

状態を正しく見極め、 原因に応じた対策を取ることで、 再起動に頼らない安定運用が可能になります。

目次