Apache auf Managed Server mit Performanceproblemen

Sonya*

New Member
Hallo zusammen,

ich habe einen Managed Server mit der folgenden Kofiguration:
Intel Pentium D915 2,8 GHZ (Dualcore 2 x 2,8 GHZ)
1024 MB RAM
2 x 80 GB Festplatte

Auf dem Server laufen Debian, php5 und mysql5. Pro Tag habe ich maximal 5000 User und zur Stoßzeiten sind gleichzeitig 300 User unterwegs. Es handelt sich um Communities mit Foren, Blogs, User Gallerien und PHP Chat.

Dieser Server hat Performanceprobleme. Ich versuche seit Wochen den Grund dafür zu finden, aber leider ist mein Schwerpunkt Anwendungsentwicklung (Web) und nicht die Systemadministration (Linux), daher komme ich nicht wirklich weiter.

Was habe ich bis lang rausgefunden:
  • Average Load liegt zu Stoßzeiten bei 6 bis 9.
  • MySQL Prozess verbraucht fast 600MB RAM(?) - Spalte VIRT in top-Ausgabe
  • Apache Prozesse laufen teilweise bis zu 20 Minuten, allerdings laut server_status werden von dem Prozess mit dieser PID verschiedene Skripte ausgeführt, so dass Auslastung durch einen bestimmten Skript nicht gegeben ist.
  • Zwischendurch startet der Server neu von alleine (ich vermute Mal wenn es zu viel Auslastung gibt)

Und jetzt Fragen an die Profis da draußen:
1. Reicht der Server für die Auslastung nicht mehr aus?
2. Wenn doch, dann wo und wie ich die Performanceengpässe aufspüren kann?

Ich brauche nur ein paar Hinweise, den Rest lese ich selbst zusammen :)

Vielen Dank für Eure Hilfe und Gruß aus dem Rheinland,
Sonya*
 
Last edited by a moderator:
Ich kenn mich auch nicht zuuu sehr damit aus, aber die 600 MB Datenbank kommen mir verdammt viel vor:
Eventuell kann man dort einiges optimieren: Bessere Primary Keys? Vielleicht ein paar Sichten definieren? Allgemeine Änderungen an den Schemata?

Es kommt mir auch seltsam vor, dass der Server neustartet. Da sollte man evtl. mal in die Logs gucken, warum er das tut. Wegen Auslastung sollte das normal nicht passieren. Ein Arzt kann ja auch nicht sagen, dass er mal durch den Garten läuft, wenn das Zimmer voll mit Patienten ist ;-)

Habt ihr überhaupt vollen Zugriff auf die Maschine, wenn er managed ist?
 
Hallo l0rd,

danke für Deine Antwort.

600 MB Datenbank kommen mir verdammt viel vor:
Eventuell kann man dort einiges optimieren: Bessere Primary Keys? Vielleicht ein paar Sichten definieren? Allgemeine Änderungen an den Schemata?
An der Datenbank kann ich nicht viel drehen. 80% von dem, was auf dem Server läuft ist Open Source und "ist so geliefert" worden. Sichten auf MySQL ISAM? Muss ich schauen, ob es geht. Die 600 MB werden aber sofort nach dem Neustart von MySQL Server verspeist und während des Betriebs bleibt es dabei.

Es kommt mir auch seltsam vor, dass der Server neustartet.
Ich habe eine Vermutung, dass er so konfiguriert wurde, als Schutz gegen Überlastung, weiß ich aber nicht genau.

Habt ihr überhaupt vollen Zugriff auf die Maschine, wenn er managed ist?
Ja, vollen Zugriff mit Root. Nützt aber nicht viel, da ich nicht wirklich weiß, wo ich ansetzen soll.

Grundsätzlich wäre für mich die Einschätzung interessant, ob der Server vielleicht einfach zu schwach für die Auslastung ist, bevor ich groß angelegte Optimierungsaktion starte. :)

Danke!
 
Hallo.

MySQL Prozess verbraucht fast 600MB RAM(?) - Spalte VIRT in top-Ausgabe

Es waere sicher hilfreicher, wenn Du die gesamte Ausgabe von "top" posten wuerdest, gerade die Spalte "virt" gibt da eher wenig Auskunft:

o: VIRT -- Virtual Image (kb)
The total amount of virtual memory used by the task. It includes
all code, data and shared libraries plus pages that have been
swapped out.

VIRT = SWAP + RES.

Wenn ich MySQL das normale Verhalten einer ordentlichen DB-Engine unterstelle wird der MySQLd versuchen, alle Indices in dem ihm verfuegbaren Speicher zu halten (-> malloc()), das OS wiederum behaelt sich vor, wenig genutzte Seiten in den SwapSpace zu schieben, bei der Angabe die Du machst weiss man aber dann auch nicht wirklich wo was anzufinden ist (oder wo ein Engpass denn waere allderweil man ueber die Auslastung von RAM und Swapspace auch nichts weiss), da spielen folgende Spalten dann mitunter noch eine Rolle (FYI):

p: SWAP -- Swapped size (kb)
The swapped out portion of a task?s total virtual memory image.

q: RES -- Resident size (kb)
The non-swapped physical memory a task has used.

RES = CODE + DATA.

r: CODE -- Code size (kb)
The amount of physical memory devoted to executable code, also known
as the ?text resident set? size or TRS.

s: DATA -- Data+Stack size (kb)
The amount of physical memory devoted to other than executable code,
also known as the ?data resident set? size or DRS.

t: SHR -- Shared Mem size (kb)
The amount of shared memory used by a task. It simply reflects mem-
ory that could be potentially shared with other processes.


Apache Prozesse laufen teilweise bis zu 20 Minuten, allerdings laut server_status werden von dem Prozess mit dieser PID verschiedene Skripte ausgeführt, so dass Auslastung durch einen bestimmten Skript nicht gegeben ist.

Da haben wir hier leider auch keinen besseren Einblick, was den Verarbeitungsaufwand im Backend angeht, aber ich wuerde mir eher den Apache denn den MySQLd genauer ansehen im Hinblick auf die Cpu-Last (wenngleich Optimierungstips gibt es hier fuer beide bereits reichlich, da bin ich auch nicht wirklich gut im Thema, aber es klingt mir eher nach httpd als nach DB).

Zwischendurch startet der Server neu von alleine (ich vermute Mal wenn es zu viel Auslastung gibt)
... *lol* ...
"jeder boot tut gut" ?

Wenn es um einen Windows-besessenen host ginge ja vielleicht (wenngleich auch dann nicht wirklich), hier bitte die Protokolle aller relevanten Dienste sichten.
Es hat einen besonderen Grund, wenn ein host oder ein "service" neu startet und Ueberlastung ist i.d.R. kein Grund dafuer.

Hast Du schon mal den Admin des hosts nach den "Neustarts" (des jeweiligen Dienstes oder des ganzen hosts?) schonmal darauf angesprochen? Was sagt der denn dazu?

Ciao,
Mercy.
 
Last edited by a moderator:
Hallo Mercenary,

danke für Deine ausführliche Antwort und für die vielen Erläuterungen. Ich versuche mich gerade durch SWAP und Co durchzukämpfen.
Es waere sicher hilfreicher, wenn Du die gesamte Ausgabe von "top" posten wuerdest, gerade die Spalte "virt" gibt da eher wenig Auskunft:
Hier ist die Ausgabe von top zur Stoßzeiten:
MOD: Bilder immer als Anhang!
Dabei geht der Wert von average load für längere Zeit schon Mal über 10 :(
Da haben wir hier leider auch keinen besseren Einblick, was den Verarbeitungsaufwand im Backend angeht.
Ich habe mich mit meinem Hoster in Verbindung gesetzt und das ist seine Antwort:
Wenn Sie zB. eine Seite haben die sehr viele Grafiken hat und diese alle erst per Convert heruntergerechnet werden müssen, kann das bei großen Quellbildern lange dauern. Sind es dann wirklich viele benötigt das System schonmal Zeit für jedes einzelne. Kommt das System dabei an seine Grenzen schiebt es die weiteren Arbeiten auf eine Art Warteliste und somit laufen diese Prozesse etwas länger bis Sie komplett abgearbeitet wurden.
Allerdings hilft es mir nicht weiter, weil ich immer noch nicht weiß, welcher Script / Datei den Engpass mit sich bringt. Als Programmierer kann ich nur etwas optimieren, wenn mir in etwa gesagt wird, wo :)
Wenn es um einen Windows-besessenen host ginge ja vielleicht (wenngleich auch dann nicht wirklich), hier bitte die Protokolle aller relevanten Dienste sichten.
Es hat einen besonderen Grund, wenn ein host oder ein "service" neu startet und Ueberlastung ist i.d.R. kein Grund dafuer.
Wahrscheinlich habe ich hier etwas Falsches erzählt. Die "Symptome" für Neustart sind für mich:
  • Seite plötzlich mit einer Servermeldung "The Server is currently not available" nicht erreichbar
  • In error_log finde ich dann "child pid 13596 exit signal Segmentation fault (11)" mehrmals hinter einander mit unterschiedlichen PIDs
Hast Du schon mal den Admin des hosts nach den "Neustarts" (des jeweiligen Dienstes oder des ganzen hosts?) schonmal darauf angesprochen? Was sagt der denn dazu?
Ja, habe ich. Die Antwort ist: Hier wurde ein Script aufgerufen das einen Fehler verursacht. Das erzeugt dann die Meldung. Gut. Aber wie kriege ich raus, welches Script das ist? Ich habe insgesamt etwa 60 MB (abzüglich Bilder) Code auf dem Server, so dass einfaches Raten, welcher Skript da bockt unmöglich scheint.

Wie gesagt, ich bin mir nicht sicher, ob ich mit dem Server die "natürliche" Grenze erreicht habe, wo die ganze Optimierung im Stichwort "mehr Ressourcen" liegt.

Danke und Gruß,
Sonya
 

Attachments

  • 6gs3-1.gif
    6gs3-1.gif
    18.4 KB · Views: 109
Last edited by a moderator:
Hallo,

kannst du uns mal die Ausgabe von "dpkg -l | grep apache2*" durchgeben`?

Ich vermute nämlich das auf deinem Server der Apache2 mit dem prefork Modul läuft. Sollte das der Fall sein könntest du versuchen den Apache2 auf das worker Modul umzustellen. Gerade bei größeren Seiten skaliert das worker Modul wesentlich besser.

Zitat: Wenn Sie zB. eine Seite haben die sehr viele Grafiken hat und diese alle erst per Convert heruntergerechnet werden müssen, kann das bei großen Quellbildern lange dauern. Sind es dann wirklich viele benötigt das System schonmal Zeit für jedes einzelne. Kommt das System dabei an seine Grenzen schiebt es die weiteren Arbeiten auf eine Art Warteliste und somit laufen diese Prozesse etwas länger bis Sie komplett abgearbeitet wurden.

Da hat dein Hoster garnicht so unrecht. Werden die Grafiken direkt nach dem Hochlanden runtergerechnet und zwischengespeichert oder werden die Grafiken bei jedem Aufruf "live" umgerechnet?
 
Last edited by a moderator:
kannst du uns mal die Ausgabe von "dpkg -l | grep apache2*" durchgeben`?
Auf dem Server ist Apache 1.3 installiert.
Code:
ii  apache                       1.3.34-4.1                               versatile, high-performance HTTP server
ii  apache-common                1.3.34-4.1                               support files for all Apache webservers
ii  apache-dev                   1.3.34-4.1                               development kit for the Apache webserver
ii  apache-doc                   1.3.34-4.1                               documentation for the Apache webserver
ii  apache2-utils                2.2.3-4+etch3                            utility programs for webservers
ii  libapache-mod-gzip           1.3.26.1a-9                              HTTP compression module for Apache
ii  libapache-mod-perl           1.29.0.4-4.1                             integration of perl with the Apache web serv
ii  libapache-ssi-perl           2.19-2                                   Implement Apache Server Side Includes in Per
Ich vermute nämlich das auf deinem Server der Apache2 mit dem prefork Modul läuft. Sollte das der Fall sein könntest du versuchen den Apache2 auf das worker Modul umzustellen. Gerade bei größeren Seiten skaliert das worker Modul wesentlich besser.
Noch mehr "schlimme Worte" :) Werde mich auch in Thema "prefork" und "worker" einarbeiten. Danke für den Hinweis.
Da hat dein Hoster garnicht so unrecht. Werden die Grafiken direkt nach dem Hochlanden runtergerechnet und zwischengespeichert oder werden die Grafiken bei jedem Aufruf "live" umgerechnet?
Bis vor kurzem hatte in phpBB3 Foren das Feature mit Miniaturenerstellung genutzt. Jetzt habe ich es abgeschaltet. Ansonsten laufen noch Coppermines auf dem Server. Hier kann ich auf die Schnelle nicht sagen, wie Coppermine da vorgeht. Muss erst untersuchen.

Gruß und vielen Dank für die Hilfe,
Sonya
 
Hallo,

der alte Apache kann nur prefork. Der Unterschied zwischen prefork und worker ist eigentlich sehr einfach.

prefork: Für jeden neuen Request wird ein neuer Prozess gestartet.
worker: Ein Prozess bearbeitet mehrere Requests auf einmal.

Was mich noch gewundert hat ist das auf deinem Server pound läuft. Pound ist ein Load Balancer der HTTP Requests an mehrere Backends (in der Regel also Webserver wie den Apache) verteilt. Ich habe nicht so einen genauen überblick über dein Setup aber ich vermute mal auf deiner Maschine laufen zwei Apache nebeneinander. Der Pound verteilt die Last zwischen den beiden. Warum das so gemacht wurde kann ich dir leider nicht sagen. Ich vermute dadurch soll eine bessere Preformance erreicht werden.

Setzt dich doch mal mit deinem Hoster in Verbindung. Er kann dir bestimmt ein moderners System zur verfügung stellen.
 
Ich habe nicht so einen genauen überblick über dein Setup aber ich vermute mal auf deiner Maschine laufen zwei Apache nebeneinander.
Danke. Dann werde ich mich schlau machen, wie ich rauskriegen kann, wieviele Apaches da laufen.
Der Pound verteilt die Last zwischen den beiden. Warum das so gemacht wurde kann ich dir leider nicht sagen. Ich vermute dadurch soll eine bessere Preformance erreicht werden.
Ich habe da auch eine Vermutung. Ich bin vor einem halben Jahr mit meinen gesamten Projekten von Shared Webhosting auf Managed Server bei gleichem Hoster gewechselt. Und ich denke, dass bei dem Umzug viele Einstellungen von Shared Hosting "mitkopiert" wurden. Ich denke da an httpd.conf (bereinigt von anderen Hosts natürlich), php.ini und my.cnf. Bin mir aber nicht sicher, ob ich richtig liege. Ist so was möglich oder es totaler Quatch?
Setzt dich doch mal mit deinem Hoster in Verbindung. Er kann dir bestimmt ein moderners System zur verfügung stellen.
Schon geschehen, in 2 Wochen ziehe ich auf die größere Maschine. Meine Sorge ist aber, dass der nächste Umzug dank mehr Ressourcen die Performanceprobleme erstmal glättet und ein halbes Jahr später schreibe ich wieder in diesem Forum, weil der Server bei mehr Auslastung wieder in die Knie geht.
 
Back
Top