tim: Apache, Sockets, gleichzeitige Verbindungen

Hallo,

Seit HTTP 1.1 kann die Verbindung (Socket) für weitere Anfragen offen gehalten werden, sprich kein erneuter Aufbau (Performance). Nun bin ich gerade feste dabei eine kleine Socketgeschichte zu schreiben (Windows) und frage mich wie hoch ich die Zahl für die gleichzeitig unterstüzten Clients angeben soll. Ich erzeuge für jede neue Verbindung (serverseitig) einen eigenen Thread, welcher für die Abhandlung zuständig ist. Jede Abhandlung kostet natürlich Zeit und leztendlich werden da im globalen Dorf mehr Timeouts erreicht als man denkt, glaube ich jedenfalls, zumindest in den Spitzenzeiten. Weiß jemand ob es da einen Richtwert oder eine performante Zahl in bezug auf die Clients gibt? Meine Überlegung ist, dass wenn eine Verbindung ca. 2 sek. bestehen bleibt und innerhalb dieser 2 sek. 30 Anfragen kommen, ich aber nur 20 angegeben habe, die restlichen 10 warten müssen (Puffer) oder dass ein Timeout eintritt. Gibt es einen Richt- oder Erfahrungswert für die Angabe der Sockets (listen)? In diversen Demos für Chats wird oft 20 angegeben aber gerade bei Chats kann ich mir das nicht vorstellen. Weiß jemand zufällig wie der Apache das handelt, sprich wann hat er seine Grenze erreicht (Verbindungen pro Zeiteinheit)?

tim

  1. Hi Tim,

    Weiß jemand ob es da einen Richtwert oder eine
    performante Zahl in bezug auf die Clients gibt?

    das kommt darauf an, welches Lastprofil Du erwartest und wie viele gleichzeitige Verbindungen Du aushalten kannst.

    Je größer der KeepAlive-Wert ist, desto höher die Chance, daß Du keinerlei zusätzliche handshakes brauchst, um neue Verbindungen aufzubauen.

    Aber gleichzeitig wird auch die mittlere Anzahl gleichzeitiger Verbindungen höher - und damit könnten Dir sehr viel früher die Ressourcen ausgehen. Es ist ein Tanz auf dem Drahtseil - denn wenn Deine Ressourcen am Ende sind, mußt Du wählen, wem Du weh tust - entweder bestehende Verbindungen schließen oder keine neuen mehr aufbauen. Beides ist lästig.

    Meine Überlegung ist, dass wenn eine Verbindung ca.
    2 sek. bestehen bleibt und innerhalb dieser 2 sek.
    30 Anfragen kommen, ich aber nur 20 angegeben habe,
    die restlichen 10 warten müssen (Puffer) oder dass
    ein Timeout eintritt.

    Wenn Du die Lebensdauer ausschließlich durch die Anzahl der Requests limitierst, dann kann genau dies passieren. Deshalb macht der Apache das schlauer ...

    Weiß jemand zufällig wie der Apache das handelt,
    sprich wann hat er seine Grenze erreicht
    (Verbindungen pro Zeiteinheit)?

    Im Apache kannst Du die Lebendauer einer Verbindung selbst definieren, und zwar durch eine Anzahl der Sekunden _und_ eine Anzahl der Requests.
    Beim Erreichen eines der beiden Grenzwerte klappt der Apache die Verbindung zu; Folge-Requests müssen also erst wieder einen Verbindungsaufbau durchlaufen.

    http://httpd.apache.org/docs/mod/core.html#keepalivetimeout
      http://httpd.apache.org/docs/mod/core.html#maxkeepaliverequests

    Apache-Default-Werte: 15 Sekunden und 100 requests - beides reicht für "üppige" HTML-Seiten mit vielen Bildern etc. aus, monopolisiert die Ressource aber nicht endlos.
    Denn beim Apache sind - in der Standard-Übersetzung - nicht mehr als 256 gleichzeitige Verbindungen möglich:
      http://httpd.apache.org/docs/mod/core.html#maxclients
    Im Klartext: man muß eine Quelltextkonstante ändern und den Apache neu übersetzen, um diese Grenze zu überwinden.

    Wir haben mal versucht, KeepAlive produktiv einzusetzen (auf TCP-Ebene würde das durchaus einiges an Traffic ersparen); es ist letztlich an den zu dummen HTTP/1.0-Proxy-Servern auf der Strecke gescheitert ...

    Viele Grüße
          Michael

    1. Hallo Michael,

      danke für dein erfrischendes Posting, hat mich sehr inspiriert und zum nachdenken bewogen. Auch das Du mir die Bezugsquellen für den Apache gezeigt hast (ich bin kein Apache-Kenner).
      Auf die Idee noch ein Zeitlimit zu nutzen bin ich bis jetzt noch nicht gekommen. Sehr interessant ... werd mich geleich ans Werk machen;)

      danke
      tim