Michael Schröpl: & (DBI::) & (mySQL): Performance-Messung

Beitrag lesen

Hallo Leute,

ich bin derzeit dabei, abschließendes Feintuning für eine Anwendung zu betreiben. Diese ist in Perl geschrieben und spricht über die DBI::-Schnittstelle eine mySQL-Datenbank an, wobei sie pro Aufruf des Perl(CGI)-Programms zwischen 5 und ca. 30 SQL-Statements abfeuert (nur SELECT, teilweise mit CREATE TEMPORARY TABLE zur Simulation von Sub-Selects).

Die Perl-Anwendung selbst kann ich schon ganz ordentlich benchmarken - die Ergebnisse der Funktion times() reichen mir dafür aus.
("use strict;" etc. sind basierend auf diesen Messungen inzwischen durch etwas Kürzeres abgelöst worden, weil die Handvoll Standard-Modul-Einbindungen schon 50% der Laufzeit des Perl-Skripts ausmachten ...)

Allerdings mißt "times()" nur die CPU-Zeiten (user und system) des Prozesses selbst und seiner Kindprozesse. mySQL selbst ist jedoch kein Kindprozeß - mein Programm macht zwar über die DBI::-Schnittstelle eine Verbindung zu mySQL auf, aber der wesentliche CPU-Zeit-Vebrauch findet innerhalb des mySQL-daemon-Prozesses statt (ich kann mit "top" zusehen - meine eigene Anwendung verbraucht praktisch keine Zeit, der mySQL-Prozeß geht aber kurzfristig steil nach oben).

Nun würde ich gerne innerhalb meiner Perl-Anwendung auch die durch meine SQL-Statements verbrauchte Zeit irgendwie sinnvoll mit erfassen (um sie beispielsweise im generierten HTML-Dokument anzuzeigen). Außerdem würde ich überhaupt erst mal vernünftige Werte sehen wollen - bisher kann ich nur grob schätzen, welcher Aufruf wieviel kostet.
Da ich zudem im Tabellen-Design schon Tuning-Elemente drin habe, bei denen ich ggf. noch an ein paar Schräubchen drehen könnte, wenn ich wüßte, was das genau bewirkt, würden mich exakte Werte für bestimmte Aufrufe ebenso interessieren wie eine Art "Hitparade" über alle durchgeführten Progammläufe. Ich glaube zwar die "schnellen" und die "langsamen" Abfragen zu kennen, aber die Faktoren, um welche sich beide voneinander unterscheiden, kenne ich nur sehr ungefähr.

Mein Programm könnte zwar die abgefeuerten SQL-Statements in eine Datei mitprotokollieren und ich könnte diese Datei über die Kommandozeile an "mysql" übergeben und dort Zeitmessung betreiben, aber ich habe die Erfahrung gemacht, daß mySQL dabei doch irgendwas cached und dasselbe Statement bei wiederholter Ausführung schneller wird als beim ersten Zugriff - welcher im realen Einsatz aber der interessante ist.

Mich würde deshalb ganz allgemein interessieren, aus welcher Richtung Ihr an mein Problem einer sinnvollen Zeitmessung meines Programms herangehen würdet.
Links auf entsprechende Dokumentationen würden mir ebenso weiter helfen wie ganz allgemeine Ideen und Diskussionsbeiträge.

Viele Grüße
      Michael