PHP / MySQL - Optimierungen


  • Mod

    @Loggy:
    Server aufrüsten -> das sind highperformance cluster systeme :p

    kennt vielleicht jemand gute Links?

    Die Tipps sind ja an und fürsich nicht schlecht, aber bis auf query anzahl zu kürzen ist alles andere entweder schon gemacht oder technisch nicht durchführbar...

    trotzdem danke!!



  • Hast du irgendwelche Template-Parser im einsatz?

    130 Queries sind wirklich verdammt viel... ich denke da müsste sich wirklich was machen lassen. Entweder musst du den Datenbankdesign vernünftig umstellen, oder die Datenmenge reduzieren. Also wenn du so lange Verzögerungen beim Aufruf der Seite auf einem Hi-Performance-Cluster-System hast, dann würd ich mir doch irgendwie sorgen machen.

    Hast du die Datenbank einwandfrei als Hauptverzögerungsquelle identifiziert oder ist das einfach ne Art Vermutung? Geh auch nochmal deine Profiler-Listen durch.... Egal wie tief die Zeiten sind, solltest du trotzdem mal die am längsten dauernde Funktion unter die Lupe nehmen.

    -junix


  • Mod

    Original erstellt von junix:
    **Hast du irgendwelche Template-Parser im einsatz?
    **

    jep!

    das ganze System ist eigentlich eine eigene Programmiersprache und der PHP Code interpretiert das ganze nur... (vereinfacht dargestellt) - der sourcecode sind ca. 9MB - also nur so damit ihr wisst warum ein script auf einem top server 3 sekunden rennen kann 🙂

    Naja, die Queries kosten 40% der Zeit - ich denke, dass man da was machen kann.

    Natürlich würde ich auch gerne an anderen Stellen optimieren, nur kenn ich mich mit optimieren von PHP nicht besonders aus...

    das datenbank design darf ich nicht ändern -> sonst killt mich der chef 😞



  • was ist das denn für ein chef? 😮 😮

    wenn auf einer seite ergebnisse von 130 querries dargestellt werden, blickt da doch niemand mehr durch (könnte ich mir vorstellen ;))



  • Kannst du nicht mehrere Queries zusammenfassen.
    Viele machen folgende Fehler:

    Anzahl Datensätze:
    Select * from tabelle;
    Schleife durch die Datensätze
    Schleifendurchläufe = Anzahl Datensätze

    Statt
    SELECT COUNT(*) from tabelle;

    Da MYSQL noch keine SUBSELECTS versteht (zumindest bis V 3.xx) behelfen sich viele mit 2 Selects anstatt JOIN

    Läuft PHP als CGI oder als Modul ?
    Modul in Apache ist schneller.

    [ Dieser Beitrag wurde am 05.05.2003 um 06:53 Uhr von Unix-Tom editiert. ]



  • naja da hat dein chef glaub bei der datenbank ein bißchen geknausert wer "high perfomance cluster" wie du sagst hat sollte sich auch net scheuen für ne "anständige" Datenbank was auszugeben ... z.B. Oracle !



  • MySQL ist aber in Sachen Geschwindigkeit kaum zu schlagen... deswegen verstehe ich deinen Einwand (der in Sachen SQL Kompatiblität ja gerechtfertigt wäre) hier nicht.



  • Original erstellt von Shade Of Mine:
    das ganze System ist eigentlich eine eigene Programmiersprache und der PHP Code interpretiert das ganze nur...

    Nichts für Ungut, aber ich glaube, alleine schon das System ist etwas am Sinn vorbei... Wenns sich nur um einen Template-Parser gehandelt hätte, ok. Aber was erhoffst du dir davon, von einem Script das interpretiert wird (zeitverlust) ein anderes Script zu interpretieren (noch mehr zeitverlust)? Der gangbarere Weg wäre hier doch eher ein eigenes CGI-Modul zu schreiben? - Ok, der Initialaufwand wäre höher (man müsste hald die ganze DB-Kommunikation neu implementieren (oder vielleicht die PHP-Libs nutzen?).

    Wie dem auch sei, wenn die Queries nur 40% der 3 sekunden einnehmen, dann würd ich am PHP Code auch noch schrauben. Wie ich oben schon sagte: nimm dir die Funktionen die am Meisten Zeit kosten mal zur Brust und wie schon so oft erwähnt: Reduzier die Abfragenzahl... Ich kann und will nicht glauben, dass die 130 Queries wirklich nötig sind um 1 Seite darzustellen...

    -junix



  • Original erstellt von Shade Of Mine:
    **[quote]Original erstellt von junix:
    [qb]Hast du irgendwelche Template-Parser im einsatz?
    **

    jep!

    das ganze System ist eigentlich eine eigene Programmiersprache und der PHP Code interpretiert das ganze nur... (vereinfacht dargestellt) - der sourcecode sind ca. 9MB - also nur so damit ihr wisst warum ein script auf einem top server 3 sekunden rennen kann 🙂

    Naja, die Queries kosten 40% der Zeit - ich denke, dass man da was machen kann.

    Natürlich würde ich auch gerne an anderen Stellen optimieren, nur kenn ich mich mit optimieren von PHP nicht besonders aus...

    das datenbank design darf ich nicht ändern -> sonst killt mich der chef :([/QB][/QUOTE]

    zieh dir mal das DE-Apache-Compile-Howto rein...
    da gibts für PHP module, mit der mann die perfomance steigern kann.
    hab hier mal ein paar teile rausgeschnitten:

    7.1. APC (Alternative PHP-Cache)

    7.1.1. Was ist APC

    APC heisst »Alternative PHP Cache«. APC wurde erdacht um einen Weg zu Performancesteigerung auf hoch belasteten Servern zu erzielen. Dies wird erreicht durch das Zwischenspeichern der php-Seiten in ihrem kompilierten Zustand, so das der Overhead des Parsens und Kompilieren nahezu eliminiert wird. Es existieren kommerzielle Produkte mit derselben Funktionalität, aber diese sind weder OpenSource noch frei verfügbar.

    --www.apc.communityconnect.com/

    Ich machte einige Performancetests mit apc und es war wirklich eine Überraschung. Eine PHP-Webpage mit verschachtelten MySQL-Abfragen (total 10 Abfragen) wurde mehr als 50% schneller.

    oder auch

    7.2. Zend-Optimizer

    7.2.1. Was ist Zend-optimizer

    Zitat www.zend.com

    Der Zend-Optimizer optimiert den Code weitergehend als die Zend-Engine, und erreicht durch dies eine Performancesteigerung.

    --www.zend.com

    Bei eigenen Performancetests habe ich einen Performance-Verlust von rund 5% gesehen? Ich stelle die Frage in den Raum, für was diese close source-Applikation den nützlich sein soll?

    Auf jeden Fall sind eigene Test angebracht um zu sehen in welchen spezifischen Fällen APC oder Zend-Optimizer das bessere Ergebnis produziert.

    Was leider nicht funktioniert, ist APC und Zend-Optimizer zusammen laufenzulassen, Apache startet erst gar nicht

    7.2.2. Download des Programms

    Hauptserver: https://www.zend.com/store/free_download.php?pid=13

    Um das Programm downloaden zu können muss man sich erst bei zend.com registrieren, meine Erfahrung war, das kein SPAM verschickt wurde aufgrund dieser Registration.

    hab allerdings keine erfahrung damit. vielleicht bring dir das was.

    Gruß mathik


  • Mod

    Original erstellt von junix:
    Nichts für Ungut, aber ich glaube, alleine schon das System ist etwas am Sinn vorbei... Wenns sich nur um einen Template-Parser gehandelt hätte, ok. Aber was erhoffst du dir davon, von einem Script das interpretiert wird (zeitverlust) ein anderes Script zu interpretieren (noch mehr zeitverlust)?

    Unsere Kunden schreiben ein Template:

    zB so:

    auth = yes
    db=tabelle
    data.read = id
    data.list = some_html_template

    und schon bekommen sie eine fertige seite dass daten aus einer datenbank liest und die seite exakt so erstellt wie sie sein soll + etliche features

    alle unsere webportale basieren darauf.
    das ding ist mehr als eine eigene sprache 🙂



  • Original erstellt von Loggy:
    [QB]So pauschale Tipps kann ich jetzt nicht geben, außer vielleicht nicht mysql_fetch_array zu benutzen, sondern gleich mysql_fetch_assoc.
    [QB]

    Was kann man denn da groß ander Preformace ändern 🙄



  • Braucht weniger Speicher und deshalb weniger Speicherzugriffe. Ist normalerweise nicht viel, bei 130 Queries mit etlichen Daten kann es aber schon was bringen.


  • Mod

    @Loggy:
    sollten wir besser
    mysql_fetch_row
    oder
    mysql_fetch_assoc
    verwenden?

    Momentan verwenden wir beides ziemlich häufig!
    was kostet ein array lookup? also arr[key]=val;
    wie teuer sind globale variablen? (also wie teuer ist der zugriff darauf im vergleich zu lokalen in der funktion - und übergabe per param?)
    werden arrays per value übergeben? sprich, wird das ganze array kopiert? (zB. wenn ich ein riesiges array mit return zurück gebe -> macht PHP da was intelligentes mit zeigern oder brutales kopieren?)
    wie teuer sind split/join im gegensatz zu substr - wenn man zB hallo.du hat und man beim . trennen will in hallo und du - besser substr+strpos+strlen verwenden oder ein split?
    wie teuer ist count() auf große arrays?
    gibts was schnelleres als: for(i=0;i=0;i<count(array);array);i++)

    PS:
    danke für eure Tipps:
    das Ding läuft Momentan mit 1/3 der queries und in nur 2/3 der Zeit 🙂
    ZendOptimizer habe ich meinem Chef vorgeschlagen... mal sehen was er macht.



  • btw, hier findet man auch ein paar gute Tipps: http://www.rent-a-database.de/mysql/mysql-127.html



  • Shade: Nochmal die Frage: Hast du dich um die am längsten dauernden Funktionen welche dir der Profiler ausspuckt nun gekümmert? ich denke du solltest dich erst mal dahinter machen statt um die Arrayverwaltung zum zu bauen.

    Ein Arraylookup dürfte recht zügig gehen. Arrays sind eine der Stärken von PHP. Schau auch mal im Framework ob du nicht einige Funktionen welche du in PHP gecodet hast nicht fertig im framework findest. (Hab mir vor Urzeiten mal meine eigene array_unique() und so weiter gebastelt weil ich sie nicht kannte... was natürlich erheblich langsamer war.)

    Zeig mal die Funktion die am meisten Zeit frisst.

    -junix



  • sollten wir besser
    mysql_fetch_row
    oder
    mysql_fetch_assoc
    verwenden?

    mysql_fetch_row ist natürlich schneller, aber aufgrund der Wartbarkeit des Codes, würde ich mysql_fetch_assoc vorziehen (außer es passt Semantisch mysql_fetch_row zu benutzen). Der Unterschied wird in diesem Fall wohl auch nicht so groß sein.

    Bei Übergabe "by Value" muss natürlich brutal kopiert werden, da ja eine Kopie erforderlich ist (aber es gibt ja in PHP auch "Call by Reference"). Bei der Rückgabe könnte das anders sein, da es in PHP ja keine Zeiger gibt. Sowas wirst du wohl mit einem Profiler ausprobieren müssen.

    Kennt denn irgendwer einen PHP Profiler (Freeware oder Opensource)?



  • Original erstellt von Loggy:
    Kennt denn irgendwer einen PHP Profiler (Freeware oder Opensource)?

    Ich kenn nur den der beim Maguma-Studio integriert ist....

    -junix


  • Mod

    Original erstellt von Loggy:
    Bei Übergabe "by Value" muss natürlich brutal kopiert werden, da ja eine Kopie erforderlich ist (aber es gibt ja in PHP auch "Call by Reference").

    sehr gut, das kann performance bringen.

    aber was passiert hier:

    function foo()
    {
    $array=array( ganz viele members, so ca. ~1KB );
    return &array;
    }

    ist das wie in C wo dann die referenz tot ist, oder ist PHP da intelligenter?

    @junix:
    ja, ich habe ein paar teure funktionen versucht zu kürzen - aber das problem ist, das geht nicht wirklich viel wenn das design nicht geändert wird.

    aber es hat durchaus etwas gebracht.
    ich habe vor die script laufzeit auf die hälfte zu drücken - 1/3 habe ich ja schon gekürzt 🙂



  • Original erstellt von Shade Of Mine:
    **aber was passiert hier:

    function foo()
    {
    $array=array( ganz viele members, so ca. ~1KB );
    return &array;
    }**

    Wie sich das verhält weiss ich nicht genau, was ich dir aber sicher sagen kann ist, dass du $array oben als call by reference übergeben könntest... (musst die Variable ja eh irgendwo deklarieren. Nur kannst du sie hald eben nicht gleich mit dem Returnwert initialisieren.

    -junix


Anmelden zum Antworten