Ich habe das Apache-httpd-Handbuch online durchgesehen und bin auf eine Richtlinie gestoßen, die dies ermöglicht. Eine Beschreibung in der Manpage gefunden für tcp
:
TCP_DEFER_ACCEPT (since Linux 2.4)
Allow a listener to be awakened only when data arrives on the
socket. Takes an integer value (seconds), this can bound the
maximum number of attempts TCP will make to complete the
connection. This option should not be used in code intended
to be portable.
Dann habe ich diesen Artikel gefunden, aber mir ist immer noch unklar, für welche Art von Workloads dies nützlich wäre. Ich gehe davon aus, dass httpd
eine Option, die speziell dafür vorgesehen ist, für Webserver relevant sein muss. Ich gehe auch davon aus, dass dies eine Option ist und nicht nur, wie httpd
Netzwerkverbindungen funktionieren , sondern dass es Anwendungsfälle gibt, in denen Sie dies wünschen, und andere, in denen dies nicht der Fall ist.
Selbst nach dem Lesen des Artikels ist mir nicht klar, welchen Vorteil es haben würde, auf den Abschluss des Drei-Wege-Handshakes zu warten. Es erscheint vorteilhaft, sicherzustellen, dass die betreffende httpd
Instanz nicht ausgetauscht werden muss, während der Handshake noch läuft, anstatt möglicherweise diese Verzögerung nach dem Herstellen einer Verbindung zu verursachen.
Für den Artikel scheint es mir auch, dass Sie unabhängig vom TCP_DEFER_ACCEPT
Status eines Sockets immer noch vier Pakete benötigen (Handshake, dann jeweils Daten). Ich weiß nicht, wie sie den Countdown auf drei herabsetzen oder wie dies eine sinnvolle Verbesserung darstellt.
Meine Frage lautet also im Grunde: Ist dies nur eine veraltete Option oder gibt es einen konkreten Anwendungsfall für diese Option?
quelle
Antworten:
(um meine Kommentare zum OP zusammenzufassen)
Der Drei-Wege-Handshake, auf den sie sich beziehen, ist Teil des TCP-Verbindungsaufbaus. Die betreffende Option bezieht sich nicht speziell darauf. Beachten Sie auch, dass der Datenaustausch nicht Teil des Drei-Wege-Handshakes ist, sondern lediglich die TCP-Verbindung im geöffneten / eingerichteten Zustand erstellt.
In Bezug auf das Vorhandensein dieser Option ist dies nicht das traditionelle Verhalten eines Sockets. Normalerweise wird der Thread des Socket-Handlers aufgeweckt, wenn die Verbindung akzeptiert wird (noch nachdem der Drei-Wege-Handshake abgeschlossen wurde). Bei einigen Protokollen beginnt die Aktivität hier ( Beispiel: Ein SMTP-Server sendet eine 220-Begrüßungszeile. Bei HTTP sendet der Webbrowser jedoch als erste Nachricht in der Konversation seine GET / POST / etc-Zeile. Bis dahin hat der HTTP-Server kein Interesse an der Verbindung (außer dem Timing) Es ist daher eine Verschwendung, den HTTP-Prozess zu aktivieren, wenn die Socket-Annahme abgeschlossen ist, da der Prozess sofort wieder einschlafen wird und auf die erforderlichen Daten wartet.
Zwar gibt es durchaus Argumente dafür, dass durch das Aufwecken von inaktiven Prozessen diese für die weitere Verarbeitung "bereit" gemacht werden können (ich erinnere mich insbesondere, dass ich Anmeldeterminals auf sehr alten Computern aufgeweckt habe und sie aus dem Swap-Modus mit hineingepackt habe), aber Sie können auch argumentieren, dass jeder Computer dies hat Der ausgelagerte Prozess stellt bereits Anforderungen an die Ressourcen, und weitere unnötige Anforderungen können die Systemleistung insgesamt verringern - selbst wenn sich die scheinbare Leistung des einzelnen Threads verbessert (was möglicherweise auch nicht der Fall ist, würde ein stark ausgelasteter Computer Engpässe bei der Datenträger-E / A aufweisen, die dies zur Folge haben würden verlangsamen Sie andere Dinge, wenn Sie eingewechselt sind, und wenn es so beschäftigt ist, kann der sofortige Schlaf es gleich wieder auswechseln). Es scheint ein Glücksspiel zu sein, und letztendlich zahlt sich das "gierige" Glücksspiel nicht unbedingt auf einem ausgelasteten Computer aus.
Mein allgemeiner Rat bezüglich dieser Leistungsoptimierung wäre, keine programmatischen Entscheidungen darüber zu treffen, was sowieso am besten ist, sondern es dem Systemadministrator und dem Betriebssystem zu ermöglichen, zusammenzuarbeiten, um die Ressourcenverwaltungsprobleme zu lösen - das ist ihre Aufgabe und sie sind viel besser geeignet, um die Auslastung des gesamten Systems und darüber hinaus zu verstehen. Geben Sie Optionen und Konfigurationsoptionen an.
Um die Frage genau zu beantworten, ist die Option für alle Konfigurationen von Vorteil, und zwar nicht in dem Ausmaß, das Sie wahrscheinlich jemals bemerken würden, es sei denn, der HTTP-Datenverkehr ist extrem hoch, aber theoretisch ist dies die "richtige" Methode. Dies ist eine Option, da nicht alle Unix-Versionen (auch nicht alle Linux-Versionen) über diese Funktion verfügen und daher für die Portabilität so konfiguriert werden kann, dass sie nicht geneigt sind.
quelle
Drei-Wege-Handshakes sind ein verbreitetes Protokoll in der Sprachtelefonie:
Sie sind in TCP wichtig, um sicherzustellen, dass der Kanal eingerichtet ist. Wenn der Client vor dem Hören von (3) mit dem Senden von Anrufen begonnen hat, besteht die Möglichkeit, dass der Server nicht zuhört oder nicht bereit ist. Das Hören (3) garantiert nicht, dass der Server nach der Übertragung nicht sofort eine Selbstentzündung erlitten hat, erhöht jedoch das Vertrauen, dass der Server empfangsbereit ist.
Wie in der Wikipedia zum Handshaking vermerkt :
Wenn Sie also bereit sind, auf ein wenig zusätzliche Sicherheit zu verzichten, dass der Server bereit ist, kann der Server Schritt (3) überspringen, und der Client geht lediglich davon aus, dass der Server bereit ist. Dies macht den obigen Protokollaustausch zu:
quelle