Dies mag programmierungsbezogen erscheinen, aber dies ist eine Frage des Betriebssystems.
Ich schreibe einen kleinen Hochleistungsdämon, der Tausende von Verbindungen pro Sekunde benötigt. Es funktioniert gut unter Linux (speziell Ubuntu 9.10 unter EC2). Wenn ich unter Mac OS X ein paar tausend Verbindungen (ungefähr 16350) in einen Benchmark werfe, der einfach eine Verbindung öffnet, es tut und die Verbindung schließt, bleibt das Benchmark-Programm einige Sekunden lang hängen und wartet darauf, dass ein Socket verfügbar wird bevor Sie fortfahren (oder eine Zeitüberschreitung im Prozess).
Ich habe sowohl Apache Bench als auch Siege verwendet (um sicherzustellen, dass es nicht die Benchmark-Anwendung ist).
Warum / wie begrenzt Mac OS X die RATE, mit der Sockets verwendet werden können, und kann ich dies verhindern?
Oder ist noch etwas los?
Ich weiß, dass es ein Dateideskriptor-Limit gibt, aber das treffe ich nicht. Es gibt keinen Fehler beim Akzeptieren eines Sockets, es bleibt einfach eine Weile nach dem ersten (ungefähr) 16000 hängen und wartet - ich nehme an - darauf, dass das Betriebssystem einen Socket freigibt. Dies sollte nicht passieren, da alle vorherigen Sockets zu diesem Zeitpunkt geschlossen sind. Sie sollen mit der Geschwindigkeit verfügbar sein, mit der sie geschlossen sind, und zwar unter Ubuntu, aber unter Mac OS X scheint es eine Art Verzögerung von mehreren (5-10?) Sekunden zu geben.
Ich habe versucht, mit ulimit in alle Richtungen zu optimieren. Nada.