Ralph: Server entlasten - wie?

Hallo liebe Selfer!

Montag ist kein guter Tag für meinen Server :-( Eigentlich sind viele Besucher ja ein Grund zur Freude, aber nicht, wenn der Server auf Hochlast läuft.

Hier mal ein Screenshot von top, kurz danach ist der Server abgeraucht:

top

Jetzt ist die Frage: wo kann ich am besten angreifen, um das in den Griff zubekommen?

Bisher habe ich folgende Massnahmen in Betrieb:

  • Caching, läuft allerdings so, dass PHP noch aufgerufen wird. Falls die Cache-Datei existiert erfolgt die Ausgabe mit passthru(). Nur falls sie nicht existiert, läuft das komplette Script samt DB-Zugriffen durch.
  • teilweise habe ich JS-Dateien zusammengeführt und CSS-Sprites in Betrieb, um die Anzahl der HTTP-Requests zu drücken. Die Seite ist aber sehr bildlastig, darum kommt da schon ein bisschen Traffic zusammen.

Danke euch fuer weitere Anregungen,
Ralph

  1. Hi,

    Danke euch fuer weitere Anregungen,

    binde http://httpd.apache.org/docs/2.2/mod/mod_status.html ein (einschließlich dem entsprechenden SetHandler) und beobachte, was sich dort tut. Damit lassen sich Flaschenhälse ganz gut finden.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  2. Hallo!

    • Caching, läuft allerdings so, dass PHP noch aufgerufen wird. Falls die Cache-Datei existiert erfolgt die Ausgabe mit passthru(). Nur falls sie nicht existiert, läuft das komplette Script samt DB-Zugriffen durch.
    • Konsequentere Nutzung der laufenden PHP-Prozesse
    • Optimierung innerhalb der Scripte, gezielte Garbage Collection (Werte "nullen")
    • wenn in dieser Hinsicht alles nichts hilft, auf eine schnellere Sprache als PHP, bspw. Perl, Python, JSP oder Lua umsteigen.
    • teilweise habe ich JS-Dateien zusammengeführt und CSS-Sprites in Betrieb, um die Anzahl der HTTP-Requests zu drücken. Die Seite ist aber sehr bildlastig, darum kommt da schon ein bisschen Traffic zusammen.

    Optimiere die statischen Dateien, wenn möglich. PNG-Bilder kann man bspw. mit optipng noch weiter packen. Evtl. ist es hilfreich, statische Dateien von einem anderen Server (bspw. mit lighttpd) auszuliefern.

    Schütze Dich vor Denial of Service-Angriffen. Mehr als eine vernünftige Anzahl von Requests innerhalb einer Sekunde sollten zur vorübergehenden Verlangsamung und bei Widerholung Sperrung führen. Die vernünftige Anzahl ist dabei die maximale Anzahl an Requests zum Laden der gleichen Seite.

    Gruß, LX

    --
    X-Self-Code: sh:( fo:) ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: Unusual
    X-Please-Search-Archive-First: Absolutely Yes
      • wenn in dieser Hinsicht alles nichts hilft, auf eine schnellere Sprache [...] Lua umsteigen.

      Ich kenn Lua hauptsächlich aus der Spieleentwicklung - hast du ein Beispiel für eine Website die mit Lua realisiert wurde?

      1. Ich habe sowas mit akuter Regelmäßigkeit gemacht, bevor ich den Job neben Cheatah angenommen habe. Mein Zwillingsbruder hat in seinem Buch über Lighttpd ein recht umfassendes Kapitel zu Lua und CGI geschrieben. An den darin beschriebenen Scripten habe ich teilweise mitgewirkt.

        Gruß, LX

        --
        X-Self-Code: sh:( fo:) ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: Unusual
        X-Please-Search-Archive-First: Absolutely Yes
  3. Moin!

    Jetzt ist die Frage: wo kann ich am besten angreifen, um das in den Griff zubekommen?

    Finde heraus, wo das Problem liegt.

    Zuerst solltest du dir mal die Logfiles angucken, die der Server schreibt. Analysiere, ob nach deinen Maßstäben hinsichtlich der reinkommenden Requests optimale Antworten gegeben werden, oder nicht. Was optimale Antworten sind, hängt natürlich vom Request ab, aber Fragen nach statischen Ressourcen sollten je Client nur einmal mit 200 und danach häufig mit 304 beantwortet werden.

    Ebenfalls wäre zu beobachten, ob die Anzahl an Apache-Prozessen ausreichend dimensioniert ist, oder ob sie an das konfigurierte Maximum stößt. Dein Load ist zwar hoch, aber die Frage ist halt: Warum? Wirklich zu tun hat die CPU ja anscheinend nicht, ist nur 50% ausgelastet, trotzdem ist die Kiste gut ausgelastet - was verbrät da so viel Zeit?

    Hinsichtlich der Optimierung wäre, sofern eine grobe Analyse z.B. der Festplatten- oder Datenbankzugriffe nichts auffälliges anzeigt, als nächster Schritt ein Profiling der PHP-Applikation angesagt.

    • teilweise habe ich JS-Dateien zusammengeführt und CSS-Sprites in Betrieb, um die Anzahl der HTTP-Requests zu drücken. Die Seite ist aber sehr bildlastig, darum kommt da schon ein bisschen Traffic zusammen.

    Dann wäre es ein Ansatzpunkt, die Bilder auf einen zweiten Server auszulagern, um so die Zahl der Requests aufzuteilen. Dieser Ansatz empfiehlt sich allerdings nur, wenn tatsächlich die Zahl der parallelen Requests auf dem Server das Problem ist, und sich auch nicht durch Hochsetzen der Apache-Prozesse mildern lässt.

    - Sven Rautenberg