Server-Optimierung für phpBB3 / MySQL and Apache

michael_2001

New Member
Hi,

falls diese Frage im falschen Forum gelandet ist, bitte einfach verschieben. Da der Thread jedoch mehrere Themengebiete abdeckt, ist eine Einstufung für mich nicht so einfach ;)


Zuerst eine kurze Erläuterung der Situation:
Ich betreibe ein etwas größeres phpBB3 auf einem dedizierten Linux-Server (AMD Opteron QuadCore 2,1ghz, 8GB RAM, ...) unter Plesk in einem eigenen Useraccount. Daneben gibt es noch zwei weitere Accounts auf denen u.a. ein Joomla, ein kleines private Burning Board Light und zwei Coppermine-Galerien laufen.

Das phpBB3 hat um die 5000 Benutzer, knapp eine halbe Million Posts und um die 10000 Threads. Durchschnittliche Besucherzahl so um die 100 bis 150, in Spitzenzeiten 400+, zzgl. ein paar hundert auf Joomla.

Das spezielle an diesem Board ist, dass es sich um ein Sportforum handelt. Das heißt an Spieltagen während eines Spiel versammeln sich ein paar hundert Nutzer im Forum, ein Teil schaut die Spiele im TV oder verfolgt sie im Radio und geben Kommentare dazu ab, ein anderer Teil lädt ständig nach um die Live-Threads als Ticker zu missbrauchen.
Fällt ein Tor oder passiert sonst etwas aufregendes kann es durchaus sein, dass mal zwei Dutzend Leute gleichzeitig auf Posten klicken und Freude oder Ärger ausdrücken wollen (während die anderen paar hundert wie Irre nachladen, was denn passiert sei ;) ).

Das heißt die Belastung ist sehr punktuell, ich denke, ihr versteht worauf ich hinaus will.

Jetzt möchte ich gern die allgemeine Umgebung so anpassen, dass der Server während dieser Zeiten stabil und ausreichend schnell bleibt. An besonders schlimmen Tagen hat mir der Watchdog auch schon mal mitgeteilt, dass sich der Apache abgeschossen hatte und erst ein paar Minuten später wieder gestartet wurde.

Die Hardware dürfte ja mehr als ausreichend dafür sein, während der Spiele befindet sich eigentlich niemand außerhalb des Forums und treibt bei anderen Projekten sein Unwesen.

Habe bereits versucht, die MySQL-Konfiguration anzupassen und für diese Anforderungen fit zu machen. Aktuell rennt das Board auch wie geschmiert, d.h. ein Klick auf einen Thread und die Seite ist sofort mit dem nächsten Wimpernschlag da. Bei Apache und PHP5 würde ich mich jedoch über weitere Tipps freuen.


Hier mal meine MySQL-Einstellungen:
Code:
[mysqld]
set-variable=local-infile=0
port            = 3306
socket          = /var/lib/mysql/mysql.sock
skip-locking
key_buffer = 32M
max_allowed_packet = 16M
max_connections = 400
table_cache = 700
thread_cache_size = 1024
sort_buffer_size = 1M
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
query_cache_size = 32M
myisam_sort_buffer_size = 128M

[mysqldump]
quick
max_allowed_packet = 16M

[isamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M

[myisamchk]
key_buffer = 64M
sort_buffer_size = 64M
read_buffer = 16M
write_buffer = 16M

Apache server-tuning.conf:
(da weiß ich wirklich nicht, was hier sinnvoll wäre, bzw. wie sich Änderungen auswirken)
Code:
<IfModule prefork.c>
        StartServers         5
        MinSpareServers      5
        MaxSpareServers     10
        ServerLimit        150
        MaxClients         150
        MaxRequestsPerChild  10000
</IfModule>

php5 resourcen-Limits:
Code:
max_execution_time = 30     ; 
max_input_time = 60     ; 
memory_limit = 32M      ;
(habe das Memory-Limit mal herunter geschraubt.


Aktuelle Speicherauslastung sieht so aus (ca. 150 User online):
Code:
             total       used       free     shared    buffers     cached
Mem:          7973       4721       3252          0         36       3888
-/+ buffers/cache:        796       7177
Swap:         1913          0       1913


Was kann/sollte man verbessern? Oder bin ich vollkommen auf dem Holzweg?


Vielen Dank für jeglichen Kommentar! :)
 
Wie gross ist die Datenmenge?

Wieviele Concurrend Writes treten auf?
Gibt es generell Graphen und Statistiken zur Auslastung des Systems und der Datenbank?
Wieviele Locks treten zu Spitzenzeiten auf?

Wie sieht generell die Prozessor und RAM Auslastung zu Spitzenzeiten aus?
Auch ist zu hinterfragen, ob Dir der query-cache zur Spitzenlast etwas bringt.
Wer genehmigt sich wieviel Rechenleistung und RAM?
Wie ist die Auslastung auf dem Storage z.B. hohe IO Wait?

Um ein anständiges Monitoring kommst Du hier vermutlich nicht drum herum.

Was man generell verbessern kann, bei hoher Schreiblast und hohen Lock z.B. wenn in die Post Tabellen und Statistik z.B. viel geschrieben wird, diese Locks auflösen in dem man InnoDB statt MyIsam verwendet.
InnoDb untersützt Row based locking. Ermöglicht parallelles Schreiben von mehreren Prozessen. Allerdings gibt es auch eine Faustformel, wobei Innodb mit ca. 8 -10 parallelen Prozessen an seine interne Grenzen kommt.
Problem ist eine nicht ideale Verwaltung der Threads.
Der Aufwand diese zu Verwalten steigt mit dem Menge an Threads zunehmend. Das bedeutet jetzt nicht, dass der Mysqld bei mehr als 10 parallelen Threads gänzlich zusammen bricht. Aber man sollte mehr vermeiden um optimale Performance zu haben. Auf Sun Solaris wurde das Problem etwas verbessert wo 20 Parallele Threads noch gut verarbeitet werden. (Und mehr CPUs helfen bei dem Problem leider auch nur bedingt)

Liefer erstmal die Zahlen wie oben genannt, dann kann man sich ein besser ein Bild zum Problem machen.

-> Stark frequentierte Daten wie z.B Statistiken, mit vielen writes kann man ggf. in dem RAM verlagen. Entweder als Memtable oder in dem die Datendateien in einer RAMDisk abgelegt werden.
Beides ist tricky und erfordert das regelmässige persitieren "schreiben auf physische Platte" um die Daten zu sichern.
Statistikdaten sind ggf. eher verschmerzlich, wenn diese nicht 100% aktuell und richtig sind. Der Trick birgt jedoch ein grosses Risiko vor Datenverlust.

Inwiefern phpBB3 mit Inndob stat MyIsam klar kommt, kann ich nicht beurteilen. Das müsstest Du ausporbieren.
Alternativ wäre noch memcachd zu nennen.
Diese bietet auch die Möglichkeit Unvollständige Daten im Vorfeld auszuliefern, während ggf. neuere Daten aus der DB nachgeladen werden.
Auch kann memcached auf Seite der Anwendung genutzt werden. Erfordert jedoch massives bearbeiten des phpBB3 Codes.

Achja das slow-query-log aktivieren und ggf. auch nicht indizierte Selects heraus fischen. Ich meine, da gab es auch bei phpBB3 nicht bzw. schlecht indizierte Tabellen.

Ich würde auch mal zu den Spitzenzeiten genau mit tracen, welche Threads und wie lange, laufen.
Deine erste Aufgabe ist es den Engpass zu finden. Bzw. die Daten des Systemzustandes zu sammeln, damit man diesen finden kann.
 
Last edited by a moderator:
Wäre nicht ein Lighttpd für dich eine Option? Ist natürlich sehr Ressourcensparend. Wäre bei mir bei solchen Datenmengen ehrlich gesagt die erste Methode zur Optimierung. Danach würde ich mich dann natürlich auch um's MySQL kümmern.

Benötigst du unbedingt Plesk?
 
Da er PHP Scripte aufruft bringt der Tausch von lighttpd gegen Apache nicht so extrem viel.
Es wäre auch zu klären ob fcgi oder mod_php zum Einsatz kommen.
Den Apachen jedoch um unnötige Module abzuspecken, dürfte deutlich mehr bringen.
 
Back
Top