コネクション数の管理 こねくしょんすうのかんり
コネクション数同時接続TIME_WAITコネクションプールfd_limit
コネクション数の管理について教えて
簡単に言うとこんな感じ!
サーバーが同時に扱えるTCP接続には限界があって、それを管理するのが「コネクション数の管理」だよ。窓口の数が限られてる銀行みたいに、溢れると「接続できない!」になる。適切に設計しないと高負荷時にサービスが落ちるんだ!
コネクション数の管理とは
サーバーが同時に処理できるTCP接続数には複数の限界(リミット)があります。これらを適切に設定・管理しないと、トラフィックが増えたときにサービスが応答しなくなります。Webサービスやクラウドシステムを設計・運用するエンジニアにとって必須の知識です。
コネクション数を制約する主な要素:
- ファイルディスクリプタ数(fd_limit):OS上ではTCPソケット1つ=ファイル1つとして扱われる
- ポート番号の範囲:クライアント側の送信元ポートは49152〜65535の約16000個
- TIME_WAITソケット:切断後60〜120秒間ソケットが占有される
- バックログキュー:
listen()のバックログ、接続待ちキューの上限
主な制約値と確認方法(Linux)
| 制約 | デフォルト | 確認コマンド |
|---|---|---|
| プロセス当たりのfd上限 | 1024 | ulimit -n |
| システム全体のfd上限 | 1048576 | sysctl fs.file-max |
| ローカルポート範囲 | 32768〜60999 | sysctl net.ipv4.ip_local_port_range |
| SYNバックログ | 128〜512 | sysctl net.ipv4.tcp_max_syn_backlog |
| listen バックログ | アプリ設定 | ss -tlnp |
歴史と背景
- 1980年代:UNIX/Linuxのプロセスごとfd=1024という制限は元々「十分大きい」設計だった
- 2000年代:C10K問題(1万同時接続問題)が提唱され、大規模Webサーバーのコネクション管理が課題に
- 2010年代:nginxやNode.jsのイベント駆動I/Oモデルが普及し、少ないスレッドで多数の接続を扱えるようになった
- 現在:クラウド・マイクロサービス環境でのコネクションプーリングが重要になっている
コネクション管理の設計パターン
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 793 | TCP(ソケット・コネクション管理の基礎) |
| RFC 7230 | HTTP/1.1 Keep-Aliveによる接続再利用 |
関連用語
- TCP — コネクション管理の対象プロトコル
- TIME_WAITとCLOSE_WAIT — コネクション数を圧迫する状態
- TCP KeepAlive — アイドル接続の維持管理
- ソケット — コネクションの実体