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.
quelle
Antworten:
Es stellt sich also heraus, dass der kurzlebige Portbereich von Mac OS X ziemlich niedrig ist.
Wikipedia teilt mir mit, dass IANA 49152 bis 65535 als "dynamische und / oder private Ports" vorschlägt, während viele Linux-Kernel 32768 bis 61000 verwenden. OS X verwendet den IANA-Bereich. Dies bedeutet, dass Linux fast doppelt so viele kurzlebige Ports zur Verfügung hat. Da jeder geschlossene Socket einen TIME_WAIT-Status durchläuft (von dem ich nichts wusste), überwältigt die Rate mein System nur.
Wie repariert man?
Dies ergibt ungefähr die doppelte Reichweite.
(Vielen Dank an Spiff, der hier ausführlicher geantwortet hat: /superuser/145989/does-mac-os-x-throttle-the-rate-of-socket-creation )
quelle
Könnte es ein Pufferlimit sein? http://www.psc.edu/networking/projects/tcptune/#MacOS
Diese Site und einige andere weisen darauf hin, dass BSD-Unix-Systeme Sockets haben, die an Dateideskriptoren gebunden sind. Möglicherweise ist die Dateibeschränkung an Ihre Open-Socket-Einschränkungen gebunden.
quelle