Traffic zwischen PHP und MySQL DB ermitteln
Günther S
- php
0 Vinzenz Mai
Hallo,
kann man mit PHP auf relativ einfache (schnelle) Weise den Traffic zu der MySQL-Datenbank ermitteln lassen (evtl. ähnlich wie man mit get_included_files() alle eingebundenen Dateien und damit deren Größe ermitteln kann)?
mysqli_stat() liefert meines Erachtens nach nicht die gewünschten Informationen (oder täusche ich mich?) und auch ansonsten habe ich im php manual keine passende Funktion gefunden.
Kann mir jemand helfen?
Gruß,
Günther
Hallo Günther,
kann man mit PHP auf relativ einfache (schnelle) Weise den Traffic zu der MySQL-Datenbank ermitteln lassen (evtl. ähnlich wie man mit get_included_files() alle eingebundenen Dateien und damit deren Größe ermitteln kann)?
wie sollte das Deiner Meinung nach funktionieren?
Der Traffic zwischen PHP und MySQL besteht im Wesentlichen aus
- den an die MySQL-Server abgesetzten Queries
- den von den MySQL-Servern zurückgelieferten Ergebnisdaten
zuzüglich Protokolloverhead (den ich jetzt einfach mal vernachlässige):
a) Wie soll der Umfang der abgesetzten Queries im Vornherein ermittelt
werden, wenn diese aufgrund von Benutzereingaben durch das Skript
zusammengestellt werden?
b) Wie soll der Umfang der zurückgelieferten Daten im Vornherein
ermittelt werden - ohne die Abfragen (die in vielen Fällen noch nicht
feststeht) ausführen zu lassen? Woher kennst Du im allgemeinen Fall
die Anzahl der Datensätze, woher kennst Du den Umfang der Feldinhalte?
Du kannst den Traffic mitloggen :-)
Freundliche Grüße
Vinzenz
Hallo Vinzenz,
ich habe mich wohl etwas unklar ausgedrückt.
a) Wie soll der Umfang der abgesetzten Queries im Vornherein ermittelt
werden, wenn diese aufgrund von Benutzereingaben durch das Skript
zusammengestellt werden?
b) Wie soll der Umfang der zurückgelieferten Daten im Vornherein
ermittelt werden - ohne die Abfragen (die in vielen Fällen noch nicht
feststeht) ausführen zu lassen? Woher kennst Du im allgemeinen Fall
die Anzahl der Datensätze, woher kennst Du den Umfang der Feldinhalte?
Gar nicht. Ich möchte erst nachdem die Queries ausgeführt worden sind und ein Ergebnis geliefert haben (oder auch nicht) wissen, was (pro MySQL-Verbindung, sprich pro Anfrage des Clients) an Traffic angefallen ist.
Du kannst den Traffic mitloggen :-)
Ja, das wäre eine Möglichkeit. Aber geht das nicht irgendwie einfacher? Ich optimiere meine Anwendung gerade auf Performance und würde daher gerne wissen, wie viele Daten da ungefähr zwischen Datenbank und Software hin- und hergeschickt werden, um zumindest vage Aussagen darüber machen zu können, ab wann (d.h. ab wie vielen Anfragen pro Zeiteinheit) man z.B. bei einem 100MBit-Ethernet, über das DB- und Applikationsserver verbunden seien, mit Engpässen rechnen muss / sollte. Und natürlich, um abzuwägen, wie viel Aufwand ich betreiben sollte, um mein System dahingehend zu verbessern.
Gruß,
Günther
Hallo Günther,
Ja, das wäre eine Möglichkeit. Aber geht das nicht irgendwie einfacher? Ich optimiere meine Anwendung gerade auf Performance
ermittle die Flaschenhälse. Warum gehst Du davon aus, dass der Netzwerkverkehr _der_ Flaschenhals ist? Es ist eine von vielen Möglichkeiten. Es gibt Queries, die wenige Daten zurückliefern, aber den DB-Server enorm belasten. Ich habe schon einfache Löschoperationen einzelner Datensätze gesehen, die aufgrund der damit verbundenen Aktionen den DB-Server 20 Sekunden beschäftigten, während der Datentransfer sich im Sub-Kilobyte-Bereich bewegte :-)
und würde daher gerne wissen, wie viele Daten da ungefähr zwischen Datenbank und Software hin- und hergeschickt werden, um zumindest vage Aussagen darüber machen zu können, ab wann (d.h. ab wie vielen Anfragen pro Zeiteinheit) man z.B. bei einem 100MBit-Ethernet, über das DB- und Applikationsserver verbunden seien, mit Engpässen rechnen muss / sollte. Und natürlich, um abzuwägen, wie viel Aufwand ich betreiben sollte, um mein System dahingehend zu verbessern.
Beseitige keine Flaschenhälse, die nicht bestehen. Optimiere, wenn Bedarf vorhanden ist.
Ob das Netzwerk der Flaschenhals ist, ermittelst Du meiner Meinung nach am besten mit einem Netzwerkmonitor. Setze automatisiert realitätsnahe Requests an Deine Anwendung ab - und schau zu, was zuerst in die Knie geht: Netzwerk, Applikationsserver oder DB-Server.
Beobachte die gleichen Kenngrößen nachher im Live-System.
Ist das Netzwerk der Flaschenhals, so minimiere den Netzwerkverkehr. Das kannst Du z.B. dadurch erreichen, dass Du Anwendungslogik in die DB verlagerst, z.B. durch Foreign-Key-Constraints und Ausnutzung von ON ... CASCADE, Stored Procedures, Trigger, ... Das setzt natürlich eine brauchbare MySQL-Version (mindestens 5.0.12) und InnoDB als Engine voraus.
Ist der DB-Server der Flaschenhals, so optimiere dort, z.B. Deine Queries mit EXPLAIN, ist der Applikationsserver der Flaschenhals so optimiere dort, z.B. durch Einsatz effizienter Algorithmen, durch Verlagerung von Anwendungslogik zum DB-Server, ...
Freundliche Grüße
Vinzenz