TCP/UDPの仕組み

コネクション数の管理 こねくしょんすうのかんり

コネクション数同時接続TIME_WAITコネクションプールfd_limit
コネクション数の管理について教えて

簡単に言うとこんな感じ!

サーバーが同時に扱えるTCP接続には限界があって、それを管理するのが「コネクション数の管理」だよ。窓口の数が限られてる銀行みたいに、溢れると「接続できない!」になる。適切に設計しないと高負荷時にサービスが落ちるんだ!


コネクション数の管理とは

サーバーが同時に処理できるTCP接続数には複数の限界(リミット)があります。これらを適切に設定・管理しないと、トラフィックが増えたときにサービスが応答しなくなります。Webサービスやクラウドシステムを設計・運用するエンジニアにとって必須の知識です。

コネクション数を制約する主な要素:

  1. ファイルディスクリプタ数(fd_limit):OS上ではTCPソケット1つ=ファイル1つとして扱われる
  2. ポート番号の範囲:クライアント側の送信元ポートは49152〜65535の約16000個
  3. TIME_WAITソケット:切断後60〜120秒間ソケットが占有される
  4. バックログキューlisten()のバックログ、接続待ちキューの上限

主な制約値と確認方法(Linux)

制約デフォルト確認コマンド
プロセス当たりのfd上限1024ulimit -n
システム全体のfd上限1048576sysctl fs.file-max
ローカルポート範囲32768〜60999sysctl net.ipv4.ip_local_port_range
SYNバックログ128〜512sysctl net.ipv4.tcp_max_syn_backlog
listen バックログアプリ設定ss -tlnp

歴史と背景

  • 1980年代:UNIX/Linuxのプロセスごとfd=1024という制限は元々「十分大きい」設計だった
  • 2000年代:C10K問題(1万同時接続問題)が提唱され、大規模Webサーバーのコネクション管理が課題に
  • 2010年代:nginxやNode.jsのイベント駆動I/Oモデルが普及し、少ないスレッドで多数の接続を扱えるようになった
  • 現在:クラウド・マイクロサービス環境でのコネクションプーリングが重要になっている

コネクション管理の設計パターン

コネクションプールの仕組み アプリケーション リクエスト① リクエスト② リクエスト③ コネクションプール TCP接続 ①(再利用) TCP接続 ②(再利用) TCP接続 ③(待機中) DBサーバー TCP接続を使い回すことで、ハンドシェイクのオーバーヘッドを削減

Linuxのfd制限を増やす設定

# プロセス当たりのfd上限を増やす(/etc/security/limits.conf)
* soft nofile 65536
* hard nofile 65536

# システム全体のfd上限(/etc/sysctl.conf)
fs.file-max = 1048576

# ローカルポート範囲を広げる
net.ipv4.ip_local_port_range = 1024 65535

関連する規格・RFC

規格・RFC番号内容
RFC 793TCP(ソケット・コネクション管理の基礎)
RFC 7230HTTP/1.1 Keep-Aliveによる接続再利用

関連用語