0

Linux BSD ソケットを使用している場合、アクティブな接続数がシステム制限を超えるとどうなりますか? コールリターンエラーを受け入れますか?

システムが無期限のソケット接続を受け入れることができたとしても、整数の最大値のサイズを超えることはできますか?

ソケット記述子は 4 バイトの整数値です。32 ビット システムで 1 つのプロセスで 4294967295 を超えるアクティブな TCP 接続を維持することは、理論的に不可能であると言えますか? (ハードウェアと OS がこれをサポートできると仮定します。サービスの品質は問題ではありません。アクティブな TCP 接続を維持したいだけです)

ばかげた質問かもしれませんが、興味があります。

4

2 に答える 2

1

Linuxシステムのaccept(2)マンページから:


       EMFILE The per-process limit of open file descriptors has been reached.

       ENFILE The system limit on the total number of open files has been reached.

       ENOBUFS, ENOMEM
              Not enough free memory.  This often means that the memory allocation is limited by the socket buffer limits, not by the
              system memory.

そうです、リモートで正常な構成では、acceptはEMFILEまたはENFILEを報告します。fd制限を空の高い値に設定すると、代わりにENOBUFS/ENOMEMが取得される可能性があります。intデータ型のINT_MAX制限よりずっと前に、これらの制限に達する可能性があります。

于 2012-11-27T14:02:20.587 に答える
1

ファイル記述子は int であるため、明らかに 4G ファイル記述子を超えることはできません。sizeof(int) がまだ 4 であるため、これは 64 ビット システムでも当てはまります。理論的には、複数のプロセスでさらに多くのファイル記述子を開くことができます。すべての /proc 制限を増やしても、最初にカーネル メモリが不足する可能性があります。

Linux カーネルのソケットごとの割り当てはキロバイトの範囲であるため、大規模なサーバー (多くの GB の RAM を搭載) でも、最大接続数は数十億ではなく数百万で測定されます。

于 2012-11-27T14:36:14.087 に答える