Einführung
In der Softwareentwicklung ist die Profilerstellung eine Technik, mit der Anwendungen zur Laufzeit analysiert werden, um mögliche Engpässe und Leistungsprobleme innerhalb einer Anwendung zu identifizieren. Es ist eine wesentliche Ressource für die Softwareoptimierung. Das Profiling unterscheidet sich vom Benchmarking dadurch, dass es die Anwendung auf Codeebene analysiert, während das Benchmarking die vom Endbenutzer erlebte Gesamtleistung der Anwendung analysieren soll.
Ein * Profiler * ist eine Software, die detaillierte Informationen über die Anwendung sammelt, um Statistiken und aufschlussreiche Daten über die Speichernutzung, Häufigkeit und Dauer von Funktionsaufrufen, die Zeit zum Beantworten einer Anfrage usw. zu generieren.
XHProf ist ein Profiler zur Analyse von PHP-Anwendungen. XHProf wurde von Facebook erstellt und von Facebook als Open-Source-Lösung bereitgestellt. Dies bedeutet, dass es im Hintergrund ausgeführt wird und die Leistung der Anwendung so wenig wie möglich beeinträchtigt.
XHGui bietet eine umfangreiche Oberfläche zur Visualisierung der über XHProf gesammelten Daten.
In diesem Tutorial erfahren Sie, wie Sie XHProf und XHGui installieren, um ein Profil für eine PHP-Anwendung zu erstellen, die unter Ubuntu 14.04 ausgeführt wird.
Voraussetzungen
Um dieser Anleitung zu folgen, benötigen Sie:
-
Ein Ubuntu 14.04-Server mit einem Benutzer ohne Root-Berechtigung, den Sie unter Initial Server einrichten können Setup
-
Eine funktionierende PHP-Webserver-Umgebung, in der eine PHP-Anwendung ausgeführt wird, die analysiert wird
Wenn Sie bereit sind, fortzufahren, melden Sie sich mit Ihrem sudo-Konto bei Ihrem Server an.
Schritt 1 - Installieren Sie die Server-Abhängigkeiten
Falls auf Ihrem Server kein "+ pecl " installiert ist, sollten Sie es jetzt installieren lassen. Wir brauchen es, um sowohl ` xhprof ` als auch die PHP-Erweiterung ` mongo +` einzurichten.
Aktualisieren Sie zuerst den Paketmanager-Cache mit:
sudo apt-get update
Als nächstes installieren wir "+ pecl " mit dem Paket " php-pear ". Wir benötigen außerdem " php5-dev ", um PHP-Module über " pecl " zu installieren, und " php5-mcrypt +", um XHGui einzurichten:
sudo apt-get install php-pear php5-dev php5-mcrypt
Führen Sie Folgendes aus, um die Erweiterung "+ mcrypt +" zu aktivieren:
sudo php5enmod mcrypt
Zuletzt benötigen wir Git, um XHGui zu installieren. Wenn Git noch nicht auf Ihrem Server installiert ist, können Sie es jetzt installieren mit:
sudo apt-get install git
Schritt 2 - Installieren Sie XHProf
Jetzt sollten wir XHProf installieren und aktivieren. Um es über + pecl +
zu installieren, führen Sie Folgendes aus:
sudo pecl install xhprof-beta
Als nächstes müssen wir die Erweiterung + xhprof +
aktivieren. Um diesen Prozess zu vereinfachen und gleichzeitig die Ubuntu / Debian-Standards beizubehalten, werden wir eine separate + ini +
- Konfigurationsdatei erstellen und diese mit dem Befehl + php5enmod +
aktivieren.
Erstellen Sie eine neue + ini
Konfigurationsdatei in` + / etc / php5 / mods-available`:
sudo nano /etc/php5/mods-available/xhprof.ini
Fügen Sie die folgenden Inhalte in diese Datei ein:
/etc/php5/mods-available/xhprof.ini
extension=xhprof.so
Führen Sie zum Aktivieren der Modulkonfigurationsdatei Folgendes aus:
sudo php5enmod xhprof
Jetzt müssen Sie nur noch den Webserver neu starten, um die Änderungen zu übernehmen. In * LAMP * -Umgebungen (Apache) können Sie dies tun mit:
sudo service apache2 restart
In * LEMP * -Umgebungen (Nginx + PHP5-FPM) sollten Sie den Dienst + php5-fpm +
neu starten mit:
sudo service php5-fpm restart
Die Erweiterung "+ xhprof +" sollte nun installiert und aktiviert sein. Zur Bestätigung können Sie Folgendes ausführen:
php --ri xhprof
Die Ausgabe sollte ungefähr so aussehen:
Outputxhprof
xhprof => 0.9.2
CPU num => 1
Schritt 3 - Installieren Sie MongoDB
Der nächste Schritt besteht darin, MongoDB und die PHP-Erweiterung "+ mongo +" auf dem Server zu installieren. MongoDB wird von XHGui verwendet, um die über die XHProf-Anwendungsanalyse erhaltenen Daten zu speichern.
Um MongoDB zu installieren, führen Sie Folgendes aus:
sudo apt-get install mongodb
Führen Sie zum Installieren der MongoDB-PHP-Erweiterung Folgendes aus:
sudo pecl install mongo
Bei der Installation werden Sie zu einem bestimmten Zeitpunkt nach Ihrer Eingabe gefragt, ob Sie die Unternehmensauthentifizierung für MongoDB aktivieren möchten. Sie können den Standardwert (Nein) beibehalten und einfach die Eingabetaste drücken, um mit der Installation fortzufahren.
Jetzt müssen wir die PHP-Erweiterung + mongo +
aktivieren, und zwar auf die gleiche Weise, wie wir es für die Erweiterung + xhprof +
getan haben. Erstellen Sie eine neue Konfigurationsdatei unter + / etc / php5 / mods-available / mongo.ini +
:
sudo nano /etc/php5/mods-available/mongo.ini
Fügen Sie den folgenden Inhalt in die Datei ein:
/etc/php5/mods-available/mongo.ini
extension=mongo.so
Führen Sie zum Aktivieren der Modulkonfigurationsdatei Folgendes aus:
sudo php5enmod mongo
Starten Sie nun den Webserver neu, um die Änderungen zu übernehmen. In * LAMP * -Umgebungen (Apache) können Sie dies tun mit:
sudo service apache2 restart
In * LEMP * -Umgebungen (Nginx + PHP5-FPM) sollten Sie den Dienst + php5-fpm +
neu starten mit:
sudo service php5-fpm restart
Die + mongo +
Erweiterung sollte nun installiert und aktiviert sein. Zur Bestätigung können Sie Folgendes ausführen:
php --ri mongo
Die Ausgabe sollte ungefähr so aussehen:
Outputmongo
MongoDB Support => enabled
Version => 1.6.12
Streams Support => enabled
SSL Support => enabled
Supported Authentication Mechanisms
MONGODB-CR => enabled
SCRAM-SHA-1 => enabled
MONGODB-X509 => enabled
GSSAPI (Kerberos) => disabled
PLAIN => disabled
...
Schritt 4 - MongoDB-Indizes einrichten (optional)
Dies ist ein optionaler, aber empfohlener Schritt, der die Gesamtleistung von XHGui beim Speichern und Zugreifen auf Daten aus MongoDB verbessert.
Greifen Sie auf den MongoDB-Client über die Befehlszeile zu:
mongo
Führen Sie nun die folgende Befehlsfolge aus, um die Indizes für XHGui zu erstellen:
use xhprof
db.results.ensureIndex( { 'meta.SERVER.REQUEST_TIME' : -1 } )
db.results.ensureIndex( { 'profile.main().wt' : -1 } )
db.results.ensureIndex( { 'profile.main().mu' : -1 } )
db.results.ensureIndex( { 'profile.main().cpu' : -1 } )
db.results.ensureIndex( { 'meta.url' : 1 } )
Führen Sie Folgendes aus, um den MongoDB-Client zu beenden:
exit
Schritt 5 - Installieren Sie XHGui
Im nächsten Schritt installieren Sie XHGui und richten es als virtuellen Host auf Ihrem Webserver ein.
Zunächst klonen wir das XHGui-Repository von Github. Da wir den Inhalt von XHGui als virtuellen Host auf dem Webserver bereitstellen müssen, platzieren wir das geklonte Repository in "+ / var / www +".
Es wird empfohlen, dass Sie das XHGui-Verzeichnis so einrichten, dass es Ihrem regulären Benutzer gehört. In diesem Beispiel verwenden wir "+ sammy +" als Benutzernamen und Gruppe, aber Sie sollten diese Werte durch Ihren eigenen Benutzernamen und Ihre eigene Gruppe ersetzen.
sudo mkdir -p /var/www/xhgui
sudo chown -R . /var/www/xhgui
cd /var/www
git clone https://github.com/perftools/xhgui.git xhgui
Führen Sie das mitgelieferte Installationsprogramm aus, um die Abhängigkeiten von XHGui zu installieren:
cd xhgui
php install.php
Nachdem die Abhängigkeiten erfolgreich installiert wurden, müssen wir einen virtuellen Host konfigurieren, der den Inhalt von "+ xhgui " bereitstellt. In den nächsten Abschnitten wird beschrieben, wie Sie einen virtuellen Host für " xhgui +" in LAMP- und LEMP-Umgebungen erstellen.
Einrichten des virtuellen Hosts von XHGui auf LAMP
Wenn wir Apache als Webserver verwenden, müssen wir zuerst sicherstellen, dass + mod_rewrite +
aktiviert ist. Führen Sie zum Aktivieren Folgendes aus:
sudo a2enmod rewrite
Erstellen Sie eine neue virtuelle Host-Datei unter "+ / etc / apache2 / sites-available":
sudo nano /etc/apache2/sites-available/xhgui.conf
Platzieren Sie den folgenden Inhalt in dieser Datei:
/etc/apache2/sites-available/xhgui.conf
<VirtualHost *:80>
DocumentRoot /var/www/xhgui/webroot
ServerName
<Directory "/var/www/xhgui/webroot">
Options Indexes MultiViews FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Beachten Sie, dass der Dokumentenstamm auf das Unterverzeichnis "+ webroot +" im Hauptverzeichnis von XHGui verweisen sollte.
Aktivieren Sie den virtuellen Host mit:
sudo a2ensite xhgui
Um die Änderungen zu übernehmen, laden Sie Apache neu mit:
sudo service apache2 reload
Einrichten des virtuellen Hosts von XHGui auf LEMP
Beginnen Sie mit der Erstellung einer neuen virtuellen Host-Datei unter + / etc / nginx / sites-available +
:
sudo nano /etc/nginx/sites-available/xhgui
Platzieren Sie den folgenden Inhalt in dieser Datei:
/ etc / nginx / sites-available / xhgui
server {
listen 80;
server_name ;
root /var/www/xhgui/webroot/;
index index.php;
location / {
try_files $uri $uri/ /index.php?$uri&$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
}
Beachten Sie, dass der Dokumentenstamm auf das Unterverzeichnis "+ webroot +" im Hauptverzeichnis von XHGui verweisen sollte.
Führen Sie zum Aktivieren des neuen virtuellen Hosts Folgendes aus:
sudo ln -s /etc/nginx/sites-available/xhgui /etc/nginx/sites-enabled/xhgui
Starten Sie nun Nginx neu, um die Änderungen zu übernehmen:
sudo service nginx restart
Schritt 6 - Richten Sie XHProf ein
Zu diesem Zeitpunkt sollten Sie in der Lage sein, über Ihren Browser auf die XHGui-Oberfläche zuzugreifen, indem Sie den Servernamen aufrufen, den Sie in Ihrer Webserverkonfiguration angegeben haben. Da wir noch keine Profildaten erfasst haben, sollte eine Seite wie die folgende angezeigt werden:
image: http: //assets.digitalocean.com/articles/xhprof-ubuntu/01-empty.png [Image 01: XHGui First Run]
Die XHProf-Erweiterung ist bereits auf dem Server installiert, der Profilerstellungsprozess für Ihre Anwendung muss jedoch noch aktiviert werden. Dies geschieht normalerweise durch Einfügen einer PHP-Direktive in Ihren Webserver, die automatisch allen ausgeführten PHP-Skripten einen Code voranstellt. Es ist wichtig darauf hinzuweisen, dass XHProf standardmäßig nur 1 von 100 Anforderungen an die Anwendung profiliert.
XHGui bietet einen Standard-PHP-Header, den Sie Ihren Skripten voranstellen können, um die Profilerstellung für Ihre Anwendung zu initialisieren. Wenn Sie alle Schritte in diesem Tutorial ausgeführt haben, sollte sich die Header-Datei unter + / var / www / xhgui / external / header.php +
befinden.
In den nächsten Abschnitten erfahren Sie, wie Sie diese Header-Datei automatisch allen Ihren PHP-Skripten in Apache- und Nginx-Umgebungen voranstellen. In diesem Beispiel aktivieren wir die Profilerstellung für eine WordPress-Anwendung, die als Hauptwebsite auf diesem Server gehostet wird.
Aktivieren der Profilerstellung unter Apache
Bearbeiten Sie die Apache-Konfigurationsdatei für die Website, deren Profil wir erstellen möchten. In diesem Beispiel aktivieren wir die Profilerstellung für die Haupt-Apache-Website, die auf diesem Server gehostet wird und unter "+ /etc/apache2/sites- available/000-default.conf +" definiert ist. Öffnen Sie diese Datei mit dem Befehlszeileneditor Ihrer Wahl:
sudo nano /etc/apache2/sites-available/000-default.conf
Fügen Sie die hervorgehobene Zeile in den vorhandenen + <VirtualHost> +
Block ein:
/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
...
...
</VirtualHost>
Speichern Sie die Datei und beenden Sie sie. Starten Sie Apache neu, um die Änderungen zu übernehmen:
sudo service apache2 restart
Aktivieren der Profilerstellung unter Nginx
Bearbeiten Sie die Nginx-Konfigurationsdatei für die Website, deren Profil wir erstellen möchten. In diesem Beispiel aktivieren wir die Profilerstellung für die auf diesem Server gehostete "+ default " - Website, die unter " / etc / nginx / sites-available / default +" definiert ist. Öffnen Sie diese Datei mit dem Befehlszeileneditor Ihrer Wahl:
sudo nano /etc/nginx/sites-available/default
Suchen Sie nun nach dem Block, der definiert, wie mit + .php +
Skripten umgegangen wird. Fügen Sie die hervorgehobene Zeile in diesen Block ein:
/ etc / nginx / sites-available / default
location ~ \.php$ {
...
...
}
Speichern Sie die Datei und beenden Sie sie. Starten Sie Nginx neu, um die Änderungen zu übernehmen:
sudo service nginx restart
Schritt 7 - Erste Schritte mit XHGui
Alles ist nun ordnungsgemäß eingerichtet. Abhängig von der Anzahl der Aufrufe, die Ihre Website normalerweise erhält, kann es einige Zeit dauern, bis die ersten Profildaten in XHGui angezeigt werden. Dies liegt an der Tatsache, dass XHProf standardmäßig nur 1 von 100 empfangenen Anfragen profiliert. Möglicherweise müssen Sie durch Ihre Website navigieren und sie einige Male neu laden, bevor Profildaten verfügbar sind.
XHGui Übersicht
Wenn Profilinformationen verfügbar sind, sollte eine Seite wie die folgende angezeigt werden:
image: http: //assets.digitalocean.com/articles/xhprof-ubuntu/02-overview.png [Image 02: XHGui Overview]
Im Folgenden finden Sie eine kurze Beschreibung der einzelnen Felder in dieser Übersichtstabelle:
-
* Methode: * Die in der analysierten Anfrage verwendete Methode
-
* URL: * Die URL, für die ein Profil erstellt wurde
-
* Uhrzeit: * Die Uhrzeit, zu der diese Profildaten erfasst wurden
-
* wt (Wall Time): * Wie lange es gedauert hat, diese Anfrage zu bearbeiten
-
* cpu: * Die Zeit, die die CPU benötigt, um diese Anforderung auszuführen
-
* mu (Memory Usage): * Durchschnittlicher Speicherbedarf während dieser Anfrage
-
* pmu (Peak Memory Usage): * Spitzenwert der Speicherauslastung während dieser Anforderung
Verwenden Sie den Link im Feld time, um die Details eines Profilierungslaufs anzuzeigen. Sie sollten eine Seite wie diese sehen:
image: http: //assets.digitalocean.com/articles/xhprof-ubuntu/03-profile.png [Image 03: Profiling Data]
Auf der linken Seite sehen Sie Informationen zu der analysierten Anfrage, z. B. die verwendete Methode, den Skriptnamen und die URL, Anforderungsparameter usw. Auf der Hauptseite können Sie die Funktionen oder Methoden identifizieren, deren Ausführung die meiste Zeit in Anspruch nahm, sowie die Funktionen oder Methoden, die den höheren Speicherverbrauch aufwiesen. Alle diese Informationen beziehen sich auf einen bestimmten Profilierungslauf und eine bestimmte Anforderung.
Funktionsaufrufe prüfen
Wenn Sie zum Ende der Seite scrollen, haben Sie Zugriff auf eine Tabelle mit detaillierten Informationen zu allen Funktionsaufrufen, die während dieser Anforderung ausgeführt wurden, einschließlich wie oft die Funktion oder Methode ausgeführt wurde, wie lange die Ausführung gedauert hat und wie viel Gedächtnis es verwendet, und viele andere interessante Details. Sie können den Tabellenkopf verwenden, um die Auflistung nach einem dieser Parameter zu ordnen. Sie können auch das Suchfeld rechts verwenden, um nach einem bestimmten Funktions- oder Methodennamen zu suchen.
image: http: //assets.digitalocean.com/articles/xhprof-ubuntu/04-functioncalls.png [Image 04: XHGui Function Calls]
Runs vergleichen
Eine der nützlichsten Funktionen von XHGui ist das Vergleichstool, mit dem Sie zwei verschiedene Profilierungsläufe vergleichen können. Auf diese Weise können Sie Änderungen an Ihrem Code vornehmen und mehrere Durchläufe vergleichen, um festzustellen, ob Ihre Änderungen zu Leistungsverbesserungen für die Anwendung geführt haben.
Wenn Sie sich eine Reihe von Profildaten ansehen, sehen Sie rechts neben dem Abschnitt Watch Functions eine Schaltfläche mit der Bezeichnung * Compare This Run *. Wenn Sie auf diese Schaltfläche klicken, wird eine Liste aller für diese bestimmte URL ausgeführten Profilierungsläufe angezeigt, in der Sie eines der Elemente in der Liste auswählen können, um eine Vergleichsansicht zu erstellen. Wählen Sie einfach den Lauf, mit dem Sie vergleichen möchten, und klicken Sie auf die Schaltfläche "Vergleichen".
So sieht die Vergleichsansicht aus:
image: http: //assets.digitalocean.com/articles/xhprof-ubuntu/05-compare.png [Image 05: XHGui-Vergleich von Läufen]
Fazit
Die Profilerstellung ist eine wichtige Technik zur Softwareoptimierung, mit der Sie detaillierte Einblicke in Ihre Anwendung auf Codeebene erhalten. Mithilfe von Tools wie XHProf und XHGui können Sie problematische Teile Ihres Codes effektiv identifizieren und die Auswirkungen von Codeänderungen auf die Leistung der Anwendung überwachen.
Weitere Informationen zu den für XHGui verfügbaren Konfigurationsoptionen finden Sie im offiziellen Github-Repository.