最近のLinuxボックスが持つことができるオープンTCP接続の理論上の最大数はいくつですか


236

ハードウェアからの無限のパフォーマンスを想定して、Linuxボックスは> 65536のオープンTCP接続をサポートできますか?

エフェメラルポートの数(<65536)により、1つのローカルIPから1つのリモートIP上の1つのポートへの接続数が制限されることを理解しています。

タプル(ローカルIP、ローカルポート、リモートIP、リモートポート)は、TCP接続を一意に定義するものです。これは、これらのパラメータの1つ以上が空いている場合、65Kを超える接続をサポートできることを意味します。たとえば、複数のローカルIPから複数のリモートホスト上の単一のポート番号への接続。

システムに別の16ビット制限はありますか?おそらくファイル記述子の数は?

回答:


350

1つのリスニングポートは、同時に複数の接続を受け入れることができます。

頻繁に引用される「64K」の制限がありますが、それはサーバーポートごとのクライアントごとであり、明確にする必要があります。

各TCP / IPパケットには、アドレス指定用の基本的に4つのフィールドがあります。これらは:

source_ip source_port destination_ip destination_port
< client            > < server                      >

TCPスタック内では、これらの4つのフィールドは、パケットを接続(ファイル記述子など)と突き合わせるための複合キーとして使用されます。

クライアントが同じ宛先の同じポートに多くの接続を持っている場合、それらのフィールドの3つは同じになります- source_port異なる接続を区別するためにのみ異なります。ポートは16ビットの数値であるため、特定のクライアントが特定のホストポートに対して確立できる接続の最大数は64Kです。

ただし、複数のクライアントはそれぞれ、一部のサーバーのポートに最大64Kの接続を確立できます。サーバーに複数のポートがある場合、またはいずれかがマルチホームである場合は、さらに増やすことができます。

したがって、実際の制限はファイル記述子です。個々のソケット接続にはファイル記述子が与えられるため、制限は実際には、システムが許可するように構成されているファイル記述子の数と、処理するリソースです。最大制限は通常300Kを超えますが、たとえばsysctlを使用して構成できます。

通常のボックスについて自慢している現実的な制限は、たとえばシングルスレッドのJabberメッセージングサーバーの場合、約80Kです。


3
理論的には、(a)SO_REUSEADDRを使用し、(b)異なる宛先IPアドレスをターゲットとする場合、64Kを超える送信接続を確立できます。しかし、カーネルメモリの制限により、おそらく最初に停止します。
Darron

4
sysctlの制限はシステム全体に対するものですよね?プロセスのファイル記述子の最大数を制限するulimitで構成可能な制限もあります。これは、デフォルトでははるかに少ない300K以上で、通常1024
pacoverflow

1
少し専門性:クライアントマシンは、ルーターから割り当てられた複数のIPアドレスを持つこともできます。これらすべてを単一のMACに割り当てることも、そのマシンに追加のIPアドレス用の複数の物理ネットワークインターフェイスを割り当てることもできます。OPは1つのIPを指定しましたが、他のIPアドレスを除外しないことが重要です。
トッド

2
@美しく説明されます!! 非常に役立つ... +100の賛成票を与えたい...ありがとうございました:-)
トムテイラー

1
tcp_fin_timeoutがデフォルトで同じソケット(ソース、ターゲット、ポートの組み合わせ)をさらに60秒間ブロックすることに注意してください。これにより、接続が頻繁に切断および再接続される場合、2つのシステム間で実際に使用可能なTCP接続の数が大幅に減少します。この問題は、TIME_WAIT状態でソケットを再利用(tcp_tw_reuse = 1)できるようにするか(常にサポートされているわけではありません)、このタイムアウトを低い値に減らすことでTCP / IP標準を破ることで最小限に抑えることができます(通常、とにかく正常に動作します)。
fgwaller

17

サーバーを実行し、1台のマシンから提供できる接続の数を決定しようとしている場合は、C10kの問題 と、多数のクライアントに同時にサービスを提供することに関連する潜在的な問題について読むとよいでしょう。


14
C10kは10歳で、楽しくありません。[これを読んで] C1024Kへの取り組み方を確認してください。
Chandranshu 2013

@Chandranshu-metabrew.com/article/ ですか?
ミッコランタライネン2017

1
@MikkoRantalainen-はい。今より良いベンチマークが利用できると思います。フェニックスの連中は、すでに200万の同時接続を実現しています。
Chandranshu 2017

3
@Chandranshu - 12M接続したDellのデモがあります:mrotaru.wordpress.com/2013/06/20/...は
ミッコRantalainen

1
かなり数年前:Intel Atom D2700、2GB RAM、120万の同時接続。私が持っていた唯一の問題は、テスト作業でのWindowsボックスに関するものでした。Intel AtomボックスをDoSしようとしている間、これらは定期的に腹を
立てていました

12

SOCK_RAWユーザーランドでrawソケット()と再実装されたTCP を使用した場合、この場合の答えは(local address, source port, destination address, destination port)タプルの数(ローカルアドレスあたり〜2 ^ 64)によってのみ制限されると思います。

もちろん、それらすべての接続の状態を維持するには大量のメモリが必要です。カーネルTCPスタックが動揺したり応答したりしないように、いくつかのiptablesルールを設定する必要があると思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.