Apache und MySql über die Schulter gesehen

Profiling ist zwar wichtig, doch erst im Praxiseinsatz zeigt sich, was eine Applikation wirklich taugt. Da ist es nützlich, zur Laufzeit ein Auge auf den Webserver zu haben, hier an Apache und MySql dargestellt.

Apache
Dank der CustomLog-Direktive kann man ein Log erstellen, das die Anfrage und die Antwortzeit des Webservers beinhaltet:

LogFormat “%U %T” Zeitfresser
CustomLog /foo/bar Zeitfresser

Aus der Logformate-Dokumentation: %T: The time taken to serve the request, in seconds. %U: The URL path requested, not including any query string.

Das Log wird in eine MySql-Datenbank importiert (möglichst nicht auf dem Produktionsserver) und ausgewertet. Dazu benötigt man lediglich eine simple SQL-Abfrage:

SELECT url, (SUM(time) / COUNT(url)) AS koeff
FROM bots
WHERE time >3
GROUP BY url
HAVING COUNT(url) >1000
ORDER BY koeff DESC

Zu deutsch: berechne die Zeit, die pro Anfrage benötigt wird. Betrachtet werden dabei nur Anfragen, die länger als 3 Sekunden benötigen und nur solche, die öfter als 1000 mal gestellt wurden. Das Ergebnis ist der Preis, den man pro Anfrage zahlen muss. Je höher desto teurer und schmerzhafter. Jetzt weiß man exakt, welche Dateien Optimierungsbedarf haben.

MySql
Was das Zeitfresser-Log für Apache, ist das Slow Query Log für MySql - mit dem Unterschied, das MySql dies sozusagen mitliefert. Per Konfigurationsdatei oder auf der Kommandozeile übergeben, listet das Slow Query Log alle Anfragen an den MySql-Server, länger als per long_query_time definiert laufen. Das Log lässt sich per mysqldumpslow auf der Kommandozeile auswerten - oder im Editor lesen ;)

Mit dem Zeitfresser- und dem Slow Query Log bekommt man widerspenstige Webapplikationen recht schnell in den Griff. Zu beachten ist allerdings, das jede Messung das System ebenfalls belastet. Man sollte nur messen, wenn man bemerkt, das das System träge ist.

One comment

  1. Pingback: WebhostingTech

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert