it-swarm.com.de

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

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

Am liebsten würde ich die CPU-Zeit auf Anfragebasis berechnen und mich darauf konzentrieren, diese zuerst zu beheben. Ist in Apache oder PHP etwas eingebaut, das dazu beitragen könnte? Ich vermute, MySQL hätte seine eigenen Metriken, die auch die serverintensivsten Abfragen identifizieren würden.

7
Rowland Shaw

Sie können auch PHP -Profile mit einer Reihe von Profilern erstellen. Mein bevorzugter ist XDebug:

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

Es ist nicht erforderlich, dass Sie eines Ihrer Skripte ändern.

Dies sollte schnell auf die Engpässe hinweisen; Es wird auch mit dem MySQL-Teil helfen. Obwohl MySQL über ein eigenes Berichtswesen verfügt, kann es vorkommen, dass 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 für nur eine Seite so oft aufgerufen wurde.

Sie können eine erste Umfrage auf einem Entwickler-Server durchführen. Optimierungsprobleme werden schnell angezeigt. Suchen Sie in Ihren Produktionsprotokollen nach den am häufigsten besuchten Seiten und analysieren Sie diese zuerst auf dem Entwickler-Server.

Wenn Sie weiterhin eine Profilerstellung auf dem Produktionsserver durchführen müssen, können Sie diese für eine Teilmenge der Anforderungen nach dem Zufallsprinzip aktivieren, um die Last zu minimieren. Aus den Dokumenten:

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

Apache mod_rewrite hilft dabei, die GET-Variable transparent hinzuzufügen, ohne dass sie an den/vom Benutzer übergeben wird.

6
Erion

Es gibt einige Möglichkeiten, dies zu erreichen. Welcher Weg am besten 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 zeitaufwändige Implementierung, wenn Ihr Code noch kein Benchmarking enthält. Fügen Sie einen Codeausschnitt hinzu, um Zeit- und Mikrotimetimer zu Beginn jedes Skripts festzulegen, und protokollieren Sie die am Ende des Skripts verstrichene Gesamtzeit und Mikrotimetimer (zusammen mit dem aufgerufenen URI). Sie können zusätzliche Benchmarking-Timer für bestimmte Funktionen hinzufügen, wenn Sie Ihren Code zu einem späteren Zeitpunkt überarbeiten müssen (denken Sie daran, zu warten, bis nach allen regulären Vorgängen abgeschlossen ist abgeschlossen, um Ihre Benchmark-Daten zu schreiben - andernfalls werden Sie die Benchmark-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 weiter (idealerweise würden Sie dies mehrmals tun, während der Datenverkehr sehr gering ist, um repräsentative Ergebnisse zu erzielen).

2
danlefree