Mit PHP MySQL Server Auslastung ermitteln

Auf immer mehr Websites kommen MySQL-Datenbanken zum Einsatz. Da sich die generelle Server Auslastung mit PHP in meinen Tests nicht so einfach ermitteln ließ, möchte ich in diesem Artikel kurz darüber schreiben, wie du dir Fakten zur Auslastung von MySQL anzeigen lassen kannst.

Wozu das ganze?

Nun dafür kann es verschiedene Gründe geben:

  • Effizienz des Skriptes prüfen
    Wenn du merkst das nach dem Ausführen spezieller Skripte, die Werte etwas stärker ansteigen, kann dich dies darauf hinweisen, dass dein Skript eventuell noch nicht ganz sauber geschrieben wurde.
  • D(D)OS Attacke erkennen
    Solltest du mit jedem Seitenaufruf auch MySQL nutzen, so wird bei vielen Seitenaufrufen innerhalb kürzester Zeit auch die Auslastung des MySQL Servers steigen.
  • Belastung durch andere Hosting Kunden prüfen
    Wenn du nur Webhosting nutzt, wirken sich auch die Aktivitäten anderer auf den MySQL Server aus. Mit dieser Methode kannst du erkennen, wie stark der MySQL Server ausgelastet ist.So habe ich zum Beispiel bei einem Projekt durchschnittlich 6 ausgeführte MySQL Queries pro Sekunde und bei einem anderen 50 (Shared Hosting). Den Unterschied merkt man deutlich.

So geht’s: MySQL Auslastung abfragen

Es gibt dafür die mysql_stat() Funktion, welche zum Beispiel folgende Ausgabe erzeugt:

Uptime: 68698
Threads: 3
Questions: 437273 [...]

Die Werte sind durch Leerzeichen getrennt. Mit diesem Wissen können wir jetzt eine kleine Funktion programmieren, die uns über folgendes informiert:

  • Uptime (Zeit in Sekunden seit dem letzten Neustart)
  • Threads (Laufende Verbindungsanfragen)
  • Questions (Alle Queries/Befehle seit letztem Neustart)
  • Slow queries (Befehle, die long_query_time [häufig: 10 Sekunden] in der Länge überschreiten)
  • Opens (Da bin ich mir selber nicht sicher)
  • Flush tables (bereinigte Tabellen)
  • Open tables (im Tabellencache gespeicherte Tabellen)
  • Queries per second avg (Anzahl der Befehle die durchschnittlich pro Sekunde erfolgen)

Und mit diesem Code können die Werte beispielsweise ausgegeben werden:

$mysql_stat = explode("  ", mysql_stat());foreach ($mysql_stat as $stat) {
     $stat = explode(":", $stat);
        echo "".$stat[0].":".$stat[1]."Trennzeichen oder Zeilenumbruch etc.";
}
Möchtest du sämtliche Informationen zu der MySQL Server Auslastung betrachten, nutze dafür SHOW STATUS:
$result = mysql_query('SHOW STATUS');
while ($row = mysql_fetch_assoc($result)) {
echo $row['Variable_name']." = ".$row['Value']."Trennzeichen oder Zeilenumbruch";
}

Wann ist die Auslastung hoch

Das ist gar nicht so einfach zu sagen. Zum einen kann man dafür Threads_running (mit SHOW STATUS) nehmen, welcher jedoch meistens nur den Wert für den eigenen Hosting Account wiederspiegelt. Queries per Second ist an sich ein ganz guter Wert, er kann allerdings durch Trafficspitzen verfälscht werden. Je höher die Uptime desto aussagekräftiger ist der Wert.

Auch Server sind nicht alle gleich, so kann es sein, dass der eine vielleicht deutlich mehr Anfragen verarbeiten muss (höhere Queries per seconds), aber dank guter Hardware, dies auch ohne Probleme schafft.

Toll – und wofür eignet sich der Wert dann wirst du fragen? Nun um zu sehen ob die Auslastung momentan durchschnittlich oder leicht erhöht ist. Wenn du die Werte zum Beispiel alle x Minuten mit PHP speichern lässt oder regelmäßig prüfst, kannst du daran Belastungsspitzen bei der MySQL Auslastung erkennen.