Profiling Apache + MySQL + PHP-Server - was ist der Engpass?

7

Wie profiliere ich einen Linux + Apache + MySQL + PHP-Server auf Geschwindigkeit?

Ich habe einen Server mit einer stark modifizierten MediaWiki-Instanz, die unter Ubuntu 8.04 ausgeführt wird. Es ist ein bisschen träge - ich habe noch nichts getan, um es zu optimieren, also bin ich mir sicher, dass es viele niedrig hängende Früchte gibt, um es ein bisschen schneller zu machen.

Aber um zu optimieren, müssen Sie zuerst messen. Wie finde ich heraus, welche der Komponenten (Apache, Php, Mysql) den größten Teil der Zeit für die Bereitstellung einer Seite in Anspruch nehmen?

Amarillion
quelle

Antworten:

10

Wenn Sie so etwas profilieren, um den Engpass zu finden, müssen Sie die Dinge einzeln ausschließen. Sie benötigen eine Basislinie, um Vergleiche zu erhalten. Wenn Sie das Tool "ab" installiert haben (es wird mit Apache geliefert), können Sie dies verwenden.

Um Ihre Basislinie zu erhalten, empfehle ich, den Durchschnitt von mindestens ein paar hundert Anfragen zu erhalten. Hier ist ein Beispiel:

$ ab -n 400 http://yousite/

Durchsuchen Sie die Ergebnisse nach der Zeile "Zeit pro Anfrage". Sie sieht ungefähr so ​​aus:

Time per request:       96.031 [ms] (mean)

Notieren Sie sich diese Zeit, da dies die Basislinie ist.

Um Apache als Täter auszuschließen, erstellen Sie eine statische Seite auf Ihrem Server (speichern Sie einfach das HTML einer Seite, die Sie für langsam / träge halten) und führen Sie ab erneut aus.

Wirf etwas PHP in die statische Seite. Es muss nicht viel davon sein, aber es sollte tatsächlich etwas Arbeit leisten. MediaWiki ist ein ziemlich guter Code. Wenn also ein PHP-Engpass auf Ihrem System vorliegt, würde mein Geld darin bestehen, den PHP-Stack tatsächlich in den Speicher zu laden und den Test erneut durchzuführen.

Schauen Sie sich die drei Zahlen an und sehen Sie, wo der größte Sprung zwischen den nächsten Schritten liegt. Meine Wette wäre, dass MySQL das langsamste der drei ist, aber es könnte sehr gut sein, dass Sie viele Bilder auf einer Seite laden, die die Gesamtanforderungszeit verlangsamt. In diesem Fall möchten Sie möglicherweise das Design des überdenken Seite.

TrueDuality
quelle
Eine weitere Sache, wenn Sie nur MySQL testen möchten, können Sie mysqlslap verwenden, um SQL automatisch zu generieren und große Mengen von SQL-Befehlen für den Server auszuführen. Ich habe festgestellt, dass dies nicht immer mit MySQL geliefert wird, sodass Sie es möglicherweise separat suchen müssen. Hier sind einige
TrueDuality
3

Wir führen eine MediaWiki-Installation in guter Größe aus und haben schnell festgestellt, dass MediaWiki stark von einer zwischengespeicherten Instanz profitiert. Andernfalls müssen bei jeder Anforderung viele Sprachdateien und Benutzerdaten geladen werden.

Cody Caughlan
quelle
Wenn Sie memcached korrekt eingerichtet haben, können Sie außerdem mehrere Seiten bereitstellen, ohne Datenbankaufrufe zu tätigen.
Phuzion
2

Zombat und Frank Farmer haben ein paar nette Vorschläge (ich mag den Vorschlag für langsame Abfragen selbst) bei Stack Overflow 697802 . ab for apache ist auch sehr nützlich, um die von Ihnen vorgenommenen Änderungen zu testen.

vinny
quelle
2

Sehr wichtig ist auch die Konfiguration des Prefork-Moduls. Ich habe die Zahlen im spezifischen Abschnitt von /etc/apache2/apache2.conf drastisch reduziert. Seitdem hatte ich eine massive Latenz, bei der die Seite bis zu einer Minute stehen blieb bevor ich mit dem Laden fertig war ... das Tracing mit den Trace- und Entwicklungsmodulen von Drupal sowie das Profiling mit xdebug ließen mich ahnungslos. Ich habe APC eingerichtet und das MYSQL-Conf modifiziert, aber der Schuldige waren tatsächlich die zu kleinen Werte für das Prefork-Modul diese auf ein moderates UND ausreichendes Niveau und jetzt ist der Server wieder blitzschnell. Achten Sie auf diese Zahlen, wenn Sie unerklärlich hohe Ausführungszeiten für Seiten haben ...

<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
# original values:
#    MaxSpareServers      10
#    MaxClients          150
# far too conservative experimental values:
#    MaxSpareServers       5
#    MaxClients            5
# good compromise:
    MaxSpareServers       10
    MaxClients            20
    MaxRequestsPerChild   0
</IfModule>

Diese Werte gelten für eine virtuelle Hostumgebung mit 512 MB RAM + 256 MB Swap. Viel Glück beim Finden des optimalen Servers;)


quelle
Für meinen Server mit 1 GB habe ich MaxClients auf 15 festgelegt. Da ich einen Server mit 1 GB habe, dachte ich, ich könnte mehr als das tun, aber bei MaxClients 25 gehen die Dinge schief.
André van Schoubroeck