これはプログラミングに関連しているように見えるかもしれませんが、これはOSの質問です。
私は毎秒数千の接続を必要とする小さな高性能デーモンを書いています。 Linux(特にEC2上のUbuntu 9.10)では正常に動作しています。 Mac OS Xで、単に接続を開き、それを実行して接続を閉じるベンチマークで数千の接続(約16350)をスローすると、ベンチマークプログラムは、ソケットが使用可能になるのを待って数秒間ハングします。続行する前に(またはプロセスでタイムアウトする前に)。
Apache BenchとSiegeの両方を使用しました(ベンチマークアプリケーションではないことを確認するため)。
では、なぜ/どのようにMac OS Xがソケットを使用できるレートを制限しているのでしょうか?また、これを停止することはできますか?
それとも何か他に起こっていることはありますか?
ファイル記述子の制限があることは知っていますが、それを達成していません。ソケットの受け入れにエラーはありません。最初の(おおよそ)16000の後、OSがソケットを解放するのを待って、しばらくの間ハングします。以前のすべてのソケットはその時点で閉じられているため、これは発生しないはずです。それらは閉じた速度で利用可能になるはずであり、Ubuntuでも利用できますが、Mac OS Xではある種のマルチ(5-10?)秒の遅延があるようです。
Ulimitを使って微調整してみました。灘。
Mac OS Xは49152でエフェメラルポートを開き始めます。ポート番号は16ビットの符号なし整数であるため、65535の可能なポートがあります。 65535-49152 =16383。TIME_WAITに16Kのポートがあると思います。
更新:次のsysctl(8)変数を確認することをお勧めします。
net.inet.ip.portrange.lowfirst: 1023
net.inet.ip.portrange.lowlast: 600
net.inet.ip.portrange.first: 49152
net.inet.ip.portrange.last: 65535
net.inet.ip.portrange.hifirst: 49152
net.inet.ip.portrange.hilast: 65535
Hifirstをもっと低い値に設定すると、システムで使用できるエフェメラルポートの数が増えると思います。
基本的にTCP仕様に違反し、TIME_WAITに非標準値を使用するようにスタックに指示するソケットオプションまたは何かがあるかもしれませんが、私はMac OSXソケットプログラマーが知るのに十分ではありませんそれ。
更新2:おそらくsetsockopt(2)を使用してSO_REUSEADDRを設定する必要があります。