Herausfinden, welche PHP-Datei 100% CPU-Auslastung erzeugt.

  • Hello,

    ja also wie der Titel schon sagt.
    Gibt es eine möglichkeit herauszufinden, welches meiner PHP-Scripte in welcher Datei eine dauerhafte CPU-Auslastung von 100% erzeugt ? Weil mein Server stürtzt deswegen öfters ab. Und ich hab keinen Plan woher das kommt.

    Lg

    PHP
    if(isset($this) || !isset($this)){ // that's the question...
  • Script für Script aufrufen und die Serverlast dabei beobachten. Idealerweise auf einer lokalen Entwicklungsumgebung testen. Eventuell am Anfang und am Ende die Zeit messen und ausgeben, wie lange das Script gebraucht hat.

  • Das Problem ist, dass der Server nicht mir gehört sondern nur gemietet ist und, dass der nur dabei auftritt, wenn ich mein script zum verschieben vieler bilddateien und zum eintragen in die datenbank aufgerufen habe...

    PHP
    if(isset($this) || !isset($this)){ // that's the question...
  • dann mach mal in der schleife, die nach und nach die bilder reinschreibt nen sleep() rein..
    könnte evtl funzen, weil du so nach jeder transaktion ne kleine pause machst und nich direkt fett daten schiebst.
    is nur ne idee, hab so ein problem bisher noch net gehabt..

  • Sowas ist selbst für Server-Administratoren schwierig rauszubekommen. Oft hilft es bei Linux-Systemen mittels "top" zu schauen, wann ein Apache-Prozess viel Last verursacht und dann nach deren Prozess-ID zu suchen und die Child-Prozesse zu ermitteln. Da das aber nicht im Bruchteil einer Sekunde geht ist es schwierig. Für dich ohne Zugriff auf die Konsole des Servers hilft da nur der manuelle Weg eines Webmaster wie oben schon beschrieben.

  • Also, das Problem scheint wirklich diese Schleife zu sein.

    Nur zu Beschreibung: ich lade ca 1000 Fotos per FTP hoch in einen Ordner und führe dann die Datei aus. Die macht folgendes:

    Eine Schleife ausführen in der jede Datei:
    - einen neuen Dateinamen erhält
    - verschoben wird
    - ein Thumbnail bekommt, das auch verschoben wird.
    - in eine Datenbank eingetragen wird (also die Dateinamen von Original und Thumbnail)

    und das alles ohne sleep();

    Hilft mir sleep() da wirklich weiter ?

    Oder wie verarbeitet man am besten so eine rießen Masse an Fotos ? (alle Fotos sind bereits verkleinert).

    PHP
    if(isset($this) || !isset($this)){ // that's the question...
  • Hmm. Könntet ihr mal eine kleine Liste geben mit typischen Fehlern, die so eine hohe Auslastung erzeugen könnten ? So typische Fehler ? Weil while(true) verwende ich sicher nicht.

    (Zur Info: ich verwende AJAX Agent, vllt hilft das)

    PHP
    if(isset($this) || !isset($this)){ // that's the question...
  • Ich hab jetzt zusammen mit meinem Serveradmin festgestellt, dass es wohl doch nicht dieses hochladen Script ist, weil das ganze gestern auch wieder aufgetreten ist ... Ich bräuchte dirgend irgendwelche Tipps, wo es versteckte CPU-Killer geben könnte. Ich verwede nur ganz normale Arrays, Schleifen, sql_functions, str_functions, image-function. Also keine Verbindungen zu andren Servern oder so, eigentlich nichts von dem ich glaub, dass es sehr serverlastig wäre. Könnte sowas auch bei zu vielen SQL Seleccts auftreten ?

    Danke

    PHP
    if(isset($this) || !isset($this)){ // that's the question...
  • Also, 1000 Fotos hochladen und davon Thumbnails erstellen verursachen bestimmt eine hohe Last. Eventuell auch noch ein fehlendes imagedestroy an den richtigen Stellen und die Speicherauslastung könnte an die Grenzen stoßen. Stellt sich auch noch die Frage, wieso man 1000 Fotos mit einem Script hochladen muss und wie groß die Fotos sind. Warum nicht mit einem FTP-Client? Und warum muss diese massenhaften Thumbs auf einem Produktivsystem erstellen?

  • Verdammt, imagedestroy hab ich garantiert vergessen ...

    Naja ich lad sie eh per FTP hoch, aber ich muss die ja auch für das Album in die Datenbank kriegen und die Thumbnails damit die Seite schneller lädt.

    die fotos haben maxmale ausmaße von 700 x 630 und max. dateigröße von 500 kb (meistens ~ 300 kb).

    Unsere Seite beinhaltet ja Partyfotos, deswegen ist das nötig.

    Aber dieses Script wurde gestern um 16.10 nicht ausgeführt. Und nur ich kann es ausführen und es geht nur wenn fotos im ordner sind. und gestern war ich da auch nicht daheim, also kanns wohl doch nicht nur an dem liegen ... ich hab keine ahnung was da schuld ist. aber in der neuen version werde ich auf alles achten, alle variablen nach gebrauch unset()en, resourcen freigeben und alle images immer nach gebrauch zerstören.

    Aber ich weiß nicht genau obs vllt auch daran liegen könnte, dass eszu viele sql selects gibt

    PHP
    if(isset($this) || !isset($this)){ // that's the question...
  • Mein Tipp: Installiere dir eine Entwicklungsumgebung und erstelle die Thumbs auf deinem Rechner. Dann schiebs du alles Bilder auf den Server und lässt per Script nur noch die DB-Einträge machen. Was speicherst du überhaupt in der DB? Je nach Scriptaufbau und bei 1000 Dateien feuerst du vermutlich min. 1000 SQL-Calls auf die DB.

  • Das wöre auch eine Möglichkeit aber ich versuchs mal mit imagedestroy...

    In die Datenbank speicher ich nur den Dateinamen vom original und vom Thumbnail.

    Was wäre für sowas die bessere lösung ?

    PHP
    if(isset($this) || !isset($this)){ // that's the question...
  • Ja das mach ich eh, das ich klar, also die DB-Verbindung bau ich nicht bei jedem Schleifenaufruf neu auf. in führe in der schleife nur ein sql_query()

    PHP
    if(isset($this) || !isset($this)){ // that's the question...
  • In der Schleife nicht jedesmal ein sql_query ausführen, sondern erst einmal alle Daten sammeln und dann auf die DB loslassen. Oder eventuell blockweise in die DB schreiben, also z.B. 10 Dateinamen sammeln und dann mit einem Insert einfügen. Ungefähr in der Form:

    Einmal editiert, zuletzt von bandit600 (10. Februar 2009 um 11:07)

  • Ahh verstehe. Ok. Ich werds mal probieren. Wenn ich daheim bin kann ich gerne den Code aus der Datei posten ... ist nicht sehr suber war nur als professorische Lösung gedacht

    PHP
    if(isset($this) || !isset($this)){ // that's the question...
  • So hier ist mein code:

    PHP
    if(isset($this) || !isset($this)){ // that's the question...
  • Schön, das ist jetzt dein Quellcode. Und nun? Soweit ich das sehe, hast du nicht einen der hier genannten Tipps umgesetzt.

    Was noch auffällt: für jede Datei wird die Funktion ends_with 3x aufgerufen, das ist unnötig. Fasse das zusammen oder benutze glob, damit kannst du vorher schon filtern. Das Resizen der Bilder würde ich in eine Funktion auslagern, das braucht man bestimmt häufiger. Und nach dem Insert gibt es keine Fehlerprüfung. Die Thumbnail-Namen musst du auch nicht in die DB hauen, die haben doch den gleichen Namen wie das Originalbild, liegen nur in unterschiedlichen Verzeichnissen.

    Siehe auch https://www.forum-hilfe.de/showthread.php?t=40570

    Einmal editiert, zuletzt von bandit600 (11. Februar 2009 um 08:53)