Drosselt Mac OS X die Rate der Socket-Erstellung?


7

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.


2
dies wurde SU Quer posted: superuser.com/questions/145989/... .. @pbhogan: bitte in Zukunft nicht tun Crossposting.
Quacksalber Quijote

Antworten:


11

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?

sudo sysctl -w net.inet.ip.portrange.first=32768
sudo sysctl -w net.inet.ip.portrange.hifirst=32768

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 )


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.