TCP KeepAlive設定の正しい考え方【有効化すれば安心ではない】

  • URLをコピーしました!

TCP KeepAlive は、 「有効にしておけば接続が安定する」 「TIME_WAITが減る」 と誤解されがちな機能です。

しかし実際には、 使い方を間違えると障害の温床 になることも少なくありません。

本記事では、 TCP KeepAlive の正しい役割と、 実務での設計・設定ポイントを解説します。

目次

TCP KeepAliveとは何か

TCP KeepAlive は、 長時間通信のない接続が生きているか確認する仕組み です。

  • 通信が途絶えていないか
  • 相手が死んでいないか

を定期的に確認します。

KeepAliveで「できること」「できないこと」

できること

  • 死んだ接続の検知
  • 半開接続の解消

できないこと

  • 短命接続の削減
  • TIME_WAITの抑制

KeepAliveが効くケース

  • 長時間アイドルな接続
  • DBコネクション
  • 常時接続のAPI

KeepAliveが意味を持たないケース

  • リクエストごとに接続を張る
  • 短命TCP接続
  • 数秒以内で切れる通信

LinuxのKeepAlive関連パラメータ

現在の設定確認

sysctl net.ipv4.tcp_keepalive_time
sysctl net.ipv4.tcp_keepalive_intvl
sysctl net.ipv4.tcp_keepalive_probes

意味

  • tcp_keepalive_time:最初の送信までの時間
  • tcp_keepalive_intvl:再送間隔
  • tcp_keepalive_probes:試行回数

設定例(一般的なサーバー)

net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 5

※ 業務要件により調整が必要です。

KeepAliveとアプリケーション設定の関係

OSのKeepAliveだけでは不十分なことが多く、

  • HTTP KeepAlive
  • DBコネクションプール

との組み合わせが重要です。

KeepAliveを誤用した典型トラブル

  • 接続が切れずリソース枯渇
  • LBのidle timeoutと不整合
  • アプリ側タイムアウトと衝突

設計時に意識すべきポイント

  1. 通信パターンを把握
  2. 短命か長命かを切り分け
  3. OS・LB・アプリのtimeout整合

やってはいけない設定

  • 理由なくKeepAlive有効化
  • timeoutを極端に長くする
  • 問題の根本原因を隠す

まとめ

TCP KeepAlive は 万能な通信安定化機能ではありません

通信設計を理解したうえで、 適切な場面にだけ使うことが、 障害を防ぐ最大のポイントです。

目次