Gibt es eine Möglichkeit zu diagnostizieren, welche PHP- oder Perl-Skripte auf einem Produktionsserver die meiste CPU-Zeit verbrauchen?

7

Auf einem Server mit geringer Leistung wird es gelegentlich von vielen Robotern getroffen, die gleichzeitig kriechen. Während eine Lösung darin besteht, mehr Rechenleistung auf den Webserver zu bringen, hat sich herausgestellt, dass einige der Skripte weniger als wunderbar optimiert sind.

Ich würde gerne in der Lage sein, die CPU-Zeit pro Anfrage zu berechnen und mich darauf zu konzentrieren, diese zuerst zu beheben. Ist in Apache oder PHP etwas eingebaut, das dazu beitragen könnte? Ich denke, MySQL hätte seine eigenen Metriken, die auch die serverintensivsten Abfragen identifizieren würden.

Rowland Shaw
quelle

Antworten:

6

Sie können auch PHP-Profile erstellen, indem Sie einen beliebigen Profiler verwenden. Mein bevorzugter ist XDebug:

http://www.xdebug.org/docs/profiler

Sie müssen keines Ihrer Skripte ändern.

Dies sollte schnell auf die Engpässe hinweisen; Es wird auch beim MySQL-Teil helfen. Obwohl MySQL über eine eigene Berichterstellung verfügt, befinden Sie sich möglicherweise in einer Situation, in der das Skript 1000 Mal hintereinander dieselbe (schnelle) Abfrage ausführt. MySQL würde dies nicht melden, aber Sie würden von XDebug bemerken, dass eine Funktion so oft für nur eine Seite aufgerufen wurde.

Sie können eine erste Umfrage auf einem Entwicklungsserver durchführen. Optimierungsprobleme werden schnell angezeigt. Finden Sie in Ihren Produktionsprotokollen heraus, welche Seiten am häufigsten besucht werden, und analysieren Sie sie zuerst auf dem Entwicklungsserver.

Wenn Sie weiterhin eine Profilerstellung auf dem Produktionsserver durchführen müssen, sollten Sie diese für eine Teilmenge der Anforderungen zufällig aktivieren, um die Last zu minimieren. Aus den Dokumenten:

Sie können den Profiler auch selektiv mit der Einstellung xdebug.profiler_enable_trigger aktivieren, die auf 1 gesetzt ist. Wenn er auf 1 gesetzt ist, können Sie den Profiler mithilfe einer GET / POST- oder COOKIE-Variablen mit dem Namen XDEBUG_PROFILE aktivieren

Apache mod_rewrite hilft beim transparenten Hinzufügen der GET-Variablen, ohne dass diese an den / vom Benutzer übergeben wird.

Erion
quelle
2

Es gibt einige Möglichkeiten, dies zu tun. Welcher Weg der beste ist, hängt letztendlich davon ab, wie viel Zeit und Mühe Sie bereit sind, einer Lösung zu widmen.

PHP-Benchmarking: Im Allgemeinen eine Implementierung mit hohem Zeit- und Arbeitsaufwand, wenn Ihr Code noch kein Benchmarking enthält. Fügen Sie einen Codeausschnitt hinzu, um die Zeit- und Mikrozeit-Timer zu Beginn jedes Skripts festzulegen, und protokollieren Sie die Gesamtzeit und die Mikrozeit, die am Ende des Skripts verstrichen sind (zusammen mit dem aufgerufenen URI). Sie können für bestimmte Funktionen zusätzliches Benchmarking Timer hinzufügen , wenn Sie Ihren Code zu einem späteren Zeitpunkt müssen Refactoring (nur nicht vergessen , bis zu warten , nachdem alle regulären Operationen abgeschlossen haben , Ihre Benchmark - Daten schreiben - ansonsten werden Sie mit den Benchmarking - Informationen stören).

wget Benchmarking: Möglicherweise der faulste Weg zum Benchmarking. Holen Sie sich eine Liste der angeforderten URIs aus Ihren Webserver-Protokollen und geben Sie sie als lokale Anforderungen an den Webserver in wget ein (idealerweise würden Sie dies mehrmals tun, während der Datenverkehr sehr gering ist, um repräsentative Ergebnisse zu erhalten).

danlefree
quelle