Anzeige:
Ergebnis 1 bis 7 von 7

Thema: php oder apache langsam?

  1. #1
    Registrierter Benutzer
    Registriert seit
    26.07.2009
    Beiträge
    19

    php oder apache langsam?

    Hallo zusammen,

    ich betreibe seit Jahren auf einem openSUSE-Rechner eine Wetterstation, welche die Daten in eine mysql-Datenbank schreibt. Um diese Daten darzustellen, habe ich einen apache laufen und ein paar php-Skripte gebastelt.

    Mein erster Versuch war, die Daten aus der Datenbank zu holen, sie als csv-Datei auf die Festplatte zu schreiben, dann ein Gnuplot-Skript zu triggern, welches ein jpg-Bild der Daten erzeugt, dann diese Bilder in eine Webseite einbindet und abschließend alle csv-Dateien wieder zu löschen.

    Mit der Zeit ist die ganze Geschichte immer langsamer geworden, eine Wetterseite mit etwas mehr als 100000 Datensätzen auf diese Art dauert 2:30min.

    Meine Vermutung war, dass es im Wesentlichen an der Festplattengeschwindigkeit liegt. Es wäre vernünftiger, die Daten nicht auf die Platte zu schreiben, um sie weiter zu verarbeiten.
    Deshalb bin ich umgestiegen auf jpgraph. Die mysql-Abfragen sind die gleichen, ich packe die Daten in ein Array und erstelle die Bilder mit jpgraph.
    Nur: Das ganze dauert jetzt noch länger: 2:45min statt 2:30.

    Als nächstes hatte ich die Selects in Verdacht. Allerdings: wenn ich jeden verwendeten Select direkt auf der Datenbank ausführe, ist die Summe aller Selects im Bereich kleiner 10 Sekunden! Das kann es also auch nicht sein.

    Was macht diese Seite so langsam?

    Schaue ich mir mit top die Last auf dem Server an, so stelle ich fest, dass kurz "mysqld" angezeigt wird (ein paar Sekunden) und danach eine CPU zu 100% für zwei Minuten ausgelastet wird durch einen Prozess namens "httpd2-prefork". Hier liegt vermutlich die Ursache.

    Ist der Apache so langsam? Wenn ja, warum?

    Das ganze läuft auf einem openSUSE 12.1-Server, frisch aufgesetzt, mit einer Atom Z530 mit 1.6GHz.

    Der Rechner, der zuvor im Einsatz war, war ein Pentium III mit 500MHz, da war es auch nicht langsamer.

    Bin für Tipps dankbar

    michel_vaclav

  2. #2
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    wie breit ist denn dein chart?
    angenommen er ist 1000px breit und du renderst 100000 werte rein, dann sind das eh faktor 100 zuviel wie du überhaupt anzeigen kannst

    mein tipp: reduzier die datenpunkte.


    --

    renderst du die datei jedesmal wenn die seite geöffnet wird im php skript (also rufst du dort das externe programm auf?)
    wenn ja du kannst optimieren indem du die grafiken via cronjobs generieren lässt


    --

    als anregung du kannst auch clientseitig im browser grafiken rendern, zB google mal nach highcharts. Wenn du viel zeit hast schaus dir mal an, ist nett was man da alles machen kann

  3. #3
    Registrierter Benutzer
    Registriert seit
    26.07.2009
    Beiträge
    19
    Hallo msi,

    ja, der Gedanke mit dem Reduzieren der Datenpunkte ist mir auch schon gekommen. Allerdings habe ich mich nach dem "wie" gefragt. Vermutlich ist meine Datenbank sub-optimal angelegt, denn weiß nicht, wie ich zB jeden 10. Datenpunkt raushole. Ich speichere alle 5 Minuten einen zusätzlichen Eintrag mit dem Primär-Key "Unixzeit". Das sind immer irgendwelche krummen Sekunden-Integers. Wie würde hier ein Select aussehen, der nur jeden 10. Datenpunkt ausgibt? Eigentlich fehlt mir eine Spalte mit fortlaufenden Nummern entsprechend der Reihenfolge der Einträge, dann könnte man mit Modulo vielleicht was machen.
    Ich bin nicht mal sicher, ob die alle halbwegs äquidistant oder in der richtigen Reihenfolge in der Datenbank sind.

    Ja, ich rendere jedes Mal.

    Mit cronjobs das Ganze regeln wäre relativ einfach, ist eine Überlegung wert.

    Und den Tipp mit highcharts werd ich mir auch anschauen.

    Danke Dir

    michel_vaclav

  4. #4
    Registrierter Benutzer
    Registriert seit
    26.07.2009
    Beiträge
    19
    So, jetzt bin ich um eine Erfahrung reicher: Der Tipp mit der Reduktion der Datenpunkte hat zwar zwei Effekte, aber beide nicht positiv:
    - Eine Beschleunigung ist messbar aber nur marginal: statt 2:45min sind es dann ungefähr 2min.
    - Einfach nur jeden x-ten Messpunkt (in Summe 500 Messpunkte pro Jahr) darstellen führt dazu, dass man bei 365 Tagen sehr schnell Artefakte auf die Graphen bekommt, die die eigentliche Information dramatisch verfälschen. Hier muss man sich dann sehr genau Gedanken über die Art der Daten machen, die man auswählt, Modulo funktioniert nicht.

    Aber:
    Ich weiß jetzt, warum es so lange dauert. Es ist weder php noch der Apache Schuld. Ich füge an die Bilder noch Statistiken an, die ich mit den Statistikfunktionen der Datenbank ermittle. Und die jedes Mal zu berechnen dauert offensichtlich fast zwei Minuten. Hier muss ich also ansetzen und die Statistiken schon in der Datenbank bereithalten und nicht erst bei der Abfrage berechnen. Das werde ich vermutlich über cronjob-gesteuerte Skripte machen.

    Gruß
    michel_vaclav

  5. #5
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    du könntest die datenbank optimieren indem du eine tabelle anlegst
    wo du aggregierte daten speicherst.

    wenn du jetzt pro minute einen wert hast könntest du beispielsweise
    in einer neuen tabelle nur werte pro stunde ablegen (also nur 1/60)

    das aggregieren kannst du je nachdem was sinn macht mit durchschnitt/max/min machen

  6. #6
    Registrierter Benutzer
    Registriert seit
    02.08.2008
    Beiträge
    177
    Aus meiner eigenen Erfahrung kann ich sagen, das bei Geschwindigkeitsproblemen in Verbindung eines lamp es in erster Linie an unsauberen Mysql Befehlen liegt, gefolgt von Fehlern in PHP-Skripten, die eigentlich schnell entdeckt werden. Mir wurde einmal zur Performance Optimierung von Datenbanken das Zauberwort index beigebracht.

    https://de.wikipedia.org/wiki/Datenbankindex
    http://www.tecchannel.de/server/sql/...tig_einsetzen/

  7. #7
    Registrierter Benutzer
    Registriert seit
    26.07.2009
    Beiträge
    19
    Zitat Zitat von msi Beitrag anzeigen
    du könntest die datenbank optimieren indem du eine tabelle anlegst
    wo du aggregierte daten speicherst.
    Ja, so mache ich es jetzt, nachdem ich jetzt gelernt habe, wie man "cronjobs" auf der Datenbank absetzt.

    Jetzt bin ich erst Mal beschäftigt.

    Danke Euch allen

    michel_vaclav

    Nachtrag: Die ersten Seiten sind fertig: 2 Sekunden statt 2:45 Minuten ist ok!
    Geändert von michel_vaclav (13-05-2012 um 09:36 Uhr)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •