~1.2 Millionen Hits // Apache2 // Welche Konfiguration

Sintec

New Member
Hallo Forengemeinde.

Ich bin nun seit ca. 2-3 Tagen auf der Suche nach der richtigen Webserver Konfiguration.

Ich betreibe ein kleines Paid4 Layer Netzwerk mit ca. 1.1-1.2 Millionen Hits pro Tag auf den Apache2 laut mod_status. (MOD: Link entfernt.)

Das Projekt arbeitet mit PHP5 und mySQL. Die Entwicklung ist sauber und ordentlich umgesetzt.

Hier nun einige Inputs für euch Experten.

Server - Hardware:
~~~~~~~~~~~~~~~~~~~~~~~~~
Betriebssystem: Debian Lenny 64bit
CPU: Intel Q9550 QuadCore
RAM: 8GB DDRRAM
HDD: 300GB (10000rpm)
~~~~~~~~~~~~~~~~~~~~~~~~~

Apache2 Konfiguration: (apache2.conf)
~~~~~~~~~~~~~~~~~~~~~~~~~
Code:
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_prefork_module>
    StartServers           1
    MinSpareServers        5
    MaxSpareServers       10
    MaxClients           150
    ServerLimit          150
    MaxRequestsPerChild 1000
</IfModule>

# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_worker_module>
    StartServers          2
    MaxClients          150
    MinSpareThreads      25
    MaxSpareThreads      75
    ThreadsPerChild      25
    MaxRequestsPerChild   0
</IfModule>
~~~~~~~~~~~~~~~~~~~~~~~~~

Top Ausgabe:
~~~~~~~~~~~~~~~~~~~~~~~~~
Code:
top - 20:20:20 up 3 days, 12:19,  2 users,  load average: 10.20, 12.36, 12.90
Tasks: 108 total,   7 running, 100 sleeping,   0 stopped,   1 zombie
Cpu(s): 82.6%us, 10.4%sy,  0.0%ni,  6.6%id,  0.0%wa,  0.1%hi,  0.3%si,  0.0%st
Mem:   8190452k total,  6843152k used,  1347300k free,   484356k buffers
Swap:  1951888k total,      772k used,  1951116k free,  3781812k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 2216 mysql     20   0  380m 147m 5940 S   50  1.8 221:04.23 mysqld
19581 www-data  20   0  210m  31m 4540 R   24  0.4   0:28.84 apache2
19851 www-data  20   0  210m  31m 4508 S   21  0.4   0:01.88 apache2
19732 www-data  20   0  209m  31m 4548 R   20  0.4   0:17.36 apache2
19675 www-data  20   0  210m  31m 4552 S   18  0.4   0:22.14 apache2
19696 www-data  20   0  210m  31m 4552 S   17  0.4   0:21.96 apache2
19858 www-data  20   0  194m  15m 4104 S   17  0.2   0:01.06 apache2
19859 www-data  20   0  209m  31m 4500 R   17  0.4   0:01.06 apache2
19699 www-data  20   0  210m  32m 4528 S   16  0.4   0:21.22 apache2
19764 www-data  20   0  210m  31m 4532 S   15  0.4   0:12.54 apache2
19799 www-data  20   0  210m  31m 4516 S   15  0.4   0:05.68 apache2
19801 www-data  20   0  210m  31m 4540 S   15  0.4   0:07.22 apache2
19819 www-data  20   0  210m  31m 4520 S   15  0.4   0:03.04 apache2
19786 www-data  20   0  210m  31m 4540 R   13  0.4   0:09.20 apache2
19734 www-data  20   0  210m  31m 4540 S   13  0.4   0:17.20 apache2
19706 www-data  20   0     0    0    0 Z   12  0.0   0:18.86 apache2 <defunct>
19824 www-data  20   0  194m  15m 4112 S   11  0.2   0:03.24 apache2
19800 www-data  20   0  210m  31m 4516 S   11  0.4   0:05.76 apache2
19778 www-data  20   0  209m  31m 4544 R    9  0.4   0:10.20 apache2
19855 www-data  20   0  194m  15m 4104 S    9  0.2   0:01.04 apache2
19805 www-data  20   0  210m  31m 4524 S    8  0.4   0:06.30 apache2
19804 www-data  20   0  210m  31m 4528 S    6  0.4   0:03.90 apache2
19760 www-data  20   0  210m  31m 4536 S    5  0.4   0:12.22 apache2
19860 www-data  20   0  209m  30m 4336 S    5  0.4   0:00.58 apache2
26656 root      20   0 16492 1772 1424 S    1  0.0   1:50.21 pipelog.pl
    4 root      15  -5     0    0    0 S    1  0.0   0:16.08 ksoftirqd/0
 2583 root      20   0 40360 6968 1540 S    1  0.1   0:10.98 munin-node
~~~~~~~~~~~~~~~~~~~~~~~~~

Wie man sieht verbraucht der Apache2 Webserver eine menge CPU-Last. Auch der mySQL-Server verbraucht gut 50% des Systems. Die mySQL-Optimierung werde ich mir in den kommenden Tagen nochmal annehmen - doch in erster Linie möchte ich den Apache2-flott bekommen.

Hoffe somit auf eure Ratschläge - google und co liefern sicherlich eine menge Information, aber irgendwie kann ich mich da nicht mit zurecht finden. Mod_Status Ausgabe kann hier eingesehen werden -> MOD: Link entfernt.

Hoffe auf eure Vorschläge.

Vielen Dank.

VG
 
Last edited by a moderator:
Nabend,

evlt. auf ein anderen Webserver umsteigen ? Wäre vllt. die beste Variante. Gibt ja genug andere Webserver die das locker wegstecken sollten :)
 
Zum letzte Beitrag will ich ergaenzen:

Ich empfehle lighttpd sofern die aktuelle Version eingespielt ist (siehe News-Forum bez DoS-Anfaelligkeit) da er auch laut "ab" eine Million Hits auf ein PHP-Skript ("hello word" mit aktueller Mikrotime) binnen einer Minute wegstecken kann ;)

Alternativ kannst du dir auch das (fuer meinen Geschmack noch etwas zuviel vor-alpha) Facebook-Projekt "HipHop for PHP" anschauen welches als Ziel die Umwandlung einer PHP-Anwendung in reinen Binary-Code hat und sogar einen eigenen (optionalen und leistungsfaehigen aber nicht konfigurierbaren) Webserver mitbringt :)

Ich kenne deine Coding-Struktur und eingesetzte Software nicht, aber hat ein Layer-Netz nicht bedeutend mehr Abfragen als Eingaben an die MySQL -zumindest in einigen Tabellen-? Memcached waere somit sinnvoll :)
 
Last edited by a moderator:
afaik nicht in der aktuellen Version.

Zumindest hat mein 2min hackn-code mit dem ich auf "Nummer sicher" gehen wollte ihn nicht nennenswert beindruckt ^^ - kann aber auch daran liegen dass mein Codingversuch eventuell nicht wie gewuenscht geklappt hat ^^

Allerdings hat Lighttpd nach wie vor keinen wirklichen Schutz vor DDoS-Attacken eingebaut - einfach genug Arbeit geben und schon sind alle seine FCGI-Handler beschaeftigt und die echten Besucher duerfen eine 500er-Seite bewundern...
Wobei man auch wieder sagen kann dass das die Arbeit von Iptables ist, nicht von Lighttpd... x Verbindungen/Minute je IP und fertig :)
 
Last edited by a moderator:
Wie man sieht verbraucht der Apache2 Webserver eine menge CPU-Last. Auch der mySQL-Server verbraucht gut 50% des Systems. Die mySQL-Optimierung werde ich mir in den kommenden Tagen nochmal annehmen - doch in erster Linie möchte ich den Apache2-flott bekommen.

Ich würde mal die php-skripten durchforsten, da ist mit sicherheit irgendwo ein problem drin.
 
Bei der Menge an Hits auf die Webseite und im Zuge eines zukünftigen Wachstums der Anwendung würde ich fast ein Loadbalancing vorschlagen.

Lastverteilung auf 2 entsprechende Server, 1 Loadbalancing System und ein NAS.

Ist halt in der Endlösung nicht ganz billig zu realisieren, aber eine dauerhafte Geschichte und flexibel um weitere Systeme erweiterbar, sollten es einmal 2 oder 3 mio Besucher Hits werden.

Denn auch wenn jetzt eine weitere Optimierung der Anwendung erfolgt und diese noch weiter abgeschlankt wird, was ist, wenn es einmal 2 mio Hits sind, irgendwo ist auch bei einem solchen System die Obergrenze erreicht und dann verliert man Besucher aufgrund von unplanmäßigen Ausfällen, weil man nicht rechtzeitig vorgeplant hat. Unschöne Sache :)
 
Bei der Menge an Hits auf die Webseite und im Zuge eines zukünftigen Wachstums der Anwendung würde ich fast ein Loadbalancing vorschlagen.

Das wäre Overkill, die Maschine sollte (auch natürlich je nach Datenbank-Auslastung) ca. 3 Mio Hits/Tag leicht aushalten.

Ich hab hier ein AMD Phenom X4-945-System mit 4GB und RAID1, das mit Apache/php und mysql (da liegt die Last im Mittel bei ca. 10000 Queries/sek) ca. 1 Mio. Hits bei ner CPU-Last von 10-20% und einer Load von 1 Mühelos macht. Performanz ist meistens in der Applikation und im Datenbankdesign rauszuholen, Load-Balancing ist halt die Keule die man relativ einfach schwingen kann.
 
Zunächst MySQL?

Ich würde zunächst mit MySQL anfangen. Der Grund ist einfach, du hast schon 50% Last darauf und Anwendungen die mit Apache laufen hängen von MySQL ab. Wobei ich schon seit einiger Zeit beobachtet habe, dass MySQL mit wachsender Größe ganz schön in die Knie gehen kann. Und solange die Prozesse in der Anwendung auf MySQL warten belasten sie halt das System.

Ich habe keine konkrete Ratschläge, aber die Richtung würde ich jetzt verfolgen.

Mit Cache und Index könnte man da etwas steigern. Hängt aber von der Anwendung ab.

Apache kann sicherlich auch einiges ab, wenn zu viele Anfragen sind können diese geblockt werden. Dazu gibt es Einstellungen in der conf-Datei(MaxClients, hast ja schon angegeben), wie viele Prozesse ausgeführt werden können. Dazu kann auch dein Dateisystem, ganz konkret die Festplatten nicht die schnellsten oder optimalsten sein. So lange für die Anfrage nicht alle Teile wie MySQL-Anfragen, Bilddateien zusammengestellt sind kann Apache keine Antwort liefern. Apache ist das letzte Glied bei der Ausgabe und muss auf alles andere warten. Über ordentliches RAID nachdenken?!

Vor allem wen man bei Apache oder auch so gut wie jedem anderen Server mit den Anfragen in den Grenzbereich kommt und die Schwelle überschritten wird dann ist meist Arbeitsspeicher und auch CPU voll. Auch langsamme Verbindung zum Klient macht dein Server langsammer, da nicht abgeschlossne Übertragungsprozesse im Speicher hängen das System mit nichtstun ausbremsen. Bei so vielen Anfragen wird hier sierelich auch ein Problem sein.
Aber dein Problem schient für mich MySQL oder Dateisystem zu sein.
 
Last edited by a moderator:
Bei vielen kleinen Files würde ich ReiserFS empfehlen.
Dann brauchst du aber weiterhin Raptor-Festplatten oder SSD's.
Ich denke billiger sollte man beispielsweise mit Hetzner's aktuellem EQ8 (24GB RAM) fahren wo man alle kleinen und oftgefragten Daten kurzerhand in ein tmpfs laed.

Zum Abschluss meine ueblichen Empfehlungen: lighttpd oder hphp, memcached und fastcgid :)
 
Bei vielen kleinen Files würde ich ReiserFS empfehlen.

Nicht bei einer Hochlast-Maschine. Reiser mag zwar schneller sein als z.B. ext3, benötigt aber signifikant mehr CPU, gerade bei großen Trees - und das dürfte bei non-static-content ausschlaggebend sein.

xfs ist hier das Dateisystem der Wahl, das bietet den besten Kompromiss.
 
Back
Top