Ankündigung

Einklappen
Keine Ankündigung bisher.

Imagick Bildverarbeitung Skript (Memory Leak ?)

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Imagick Bildverarbeitung Skript (Memory Leak ?)

    Hallo zusammen,

    ich bin neu hier und habe ein Problem mit einem PHP-Skript. Es handelt sich um ein Skript für eine Community-Seite, welches Bilder verkleinern und drehen soll. Für die Bildverarbeitung verwende ich Imagick.

    Bei Lasttests mit JMeter habe ich festgestellt, dass der Arbeitsspeicher (24GB) des Apache-Servers nach einiger Zeit voll läuft. Offenbar steht irgendetwas im Arbeitsspeicher weiter zur Verfügung nachdem das Skript schon beendet ist.

    Ich benutze Imagick zum ersten Mal und weiß nicht ob dabei Memory Leaks entstehen können. Eventuell liegt es auch am Testplan und die Sessions werden zu lange im Arbeitsspeicher gehalten.

    Testskript:

    Code:
    Threadgroup
    ->Cookie Manager
    ->Bilddatei wird hochgeladen
    ->Bilddatei wird verkleinert und gedreht
    Für alle Testverbindungen wird keepalive verwendet (bin nicht sicher ob das wichtig ist).

    PHP-Skript:

    PHP-Code:
    $db = @ mysql_connect ("localhost""root""test")
    or die (
    'Konnte keine Verbindung zur Datenbank herstellen');
    $db_select = @ mysql_select_db ("test");

    @
    session_start();

    //Max. Abma¤e laden        
    $imagick = new Imagick($file);
                    
    //Imagedaten holen
    $size $imagick->getImageGeometry(); 
    $width intval($size['width']);
    $height intval($size['height']);
            
    //Image auf maximale Gr?¤e strecken/verkleinern
    $rheight $rwidth $height $width;
                                        
    //Resampelte Version erstellen
    $newname $path.$id."_0.".$ext;
    $smaller $path.$id."_0_sm.".$ext;
    $imagick->thumbnailImage($rwidth$rheight);
    $imagick->writeImage($newname);
    $imagick->destroy();
                
    //Thumbnail erstellen
    $tmbname $path.$id.'_tmb.jpg';
    $tmb = new Imagick();
    $tmb->readImage($newname);
    $rotateimg $tmb->clone();
    $tmb->stripImage();
    $tmbwidth $width 131 $height;
    $tmb->thumbnailImage($tmbwidth131);
    $tmb->writeImage($tmbname);
    $tmb->destroy();

    //Gedrehte Versionen erstellen
    $rotateimg->rotateImage(new ImagickPixel(), 270);
    $rotateimg->writeImage($path.$id."_90.".$ext);
    $rotateimg->rotateImage(new ImagickPixel(), 270);
    $rotateimg->writeImage($path.$id."_180.".$ext);
    $rotateimg->rotateImage(new ImagickPixel(), 270);
    $rotateimg->writeImage($path.$id."_270.".$ext);
    $rotateimg->destroy();
            
    $_SESSION['own'][] = array($id$width$height$rwidth$rheight);
            
    unset(
    $imagick$thumbnail$rotateimg$size);
    mysql_close($db);
    exit(); 
    Ich wäre für Eure Hilfe echt dankbar. Bin nämlich mittlerweile mit meinem Latein am Ende.

    Vielen Dank im Voraus.

    Gruß Christian


  • #2
    Infos über Betriebsystem, Versionen (php, imagemagick, weitere aktive extensions [phpinfo ?], ..., selbst kompiliert / PECL / paket aus der distri ) wäre interessant.

    Dann schmeiss doch mal wirklich alles raus was du nicht brauchst, mysql, session, dann kannst du das komplett ausschließen.

    Dann mal schauen was apache auf seiner übersicht-seite an "offenen/aktiven" verbindungen sagt.

    Eventuell mal einen blick mit http://forge.bearstech.com/trac/wiki/PhpTop wagen um mal zu sehen was passiert.
    robo47.net - Blog, Codeschnipsel und mehr
    | Caching-Klassen und Opcode Caches in php | Robo47 Components - PHP Library extending Zend Framework

    Kommentar


    • #3
      Danke für die Antwort. Auf Top kann ich im Moment nicht zugreifen.
      Hab hier zuhause keinen root-Zugang. Testen kann ich erst Montag wieder.
      Hier aber schon einmal die phpinfo:

      http://www.file-upload.net/download-...info.html.html

      Kommentar


      • #4
        Was hast du denn bisher getan/getestet ?

        Sind ja alles scheinbar out-of-the-box debian lenny pakete, mal geschaut ob es bei php, imagemagick, pecl oder debian lenny für die pakete/versionen irgendwelche eventuell bugreports gibt (eventuell auch schon geschlossene die aber in deiner Version noch nicht geschlossen sind ?)

        Ansonsten am besten mal händisch ein komplett aktuelles set von php + imagemagick + pecl imagemagick-extension kompilieren und in nem vhost via cgi das php testen.
        robo47.net - Blog, Codeschnipsel und mehr
        | Caching-Klassen und Opcode Caches in php | Robo47 Components - PHP Library extending Zend Framework

        Kommentar


        • #5
          Ich wiederhole noch mal robos implizit gestellte Frage, wofür baust du im gezeigten Code die Datenbankverbindung auf, und was schreibst du in die Session?

          Werden die erzeugten Bildversionen gecached, oder veranstaltest du das bei jedem Abfruf auf's neue?

          Und mit was für Nutzer-/Zugriffszahlen hast du den Lasttest gemacht?
          [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

          Kommentar


          • #6
            nach wievielen MaxRequestsPerChild werden denn die Apache Prozesse gekillt?
            [URL="http://blog.badnoob.com"]DevBlog[/URL]|[URL="http://www.awesay.com"]3D Online-Shopping[/URL]|[URL="http://www.xatrium.com"]Xatrium[/URL]

            Kommentar


            • #7
              @ChrisB:
              In der Datenbank habe ich Flags für die Verarbeitung gespeichert. Die Verarbeitung kann nur durchgeführt werden, wenn eine der Flags positiv ist, so kann kann ich die Anzahl der gleichzeitigen Verarbeitungen kontrollieren bzw. eine Warteschleife aufbauen. Ich habe den Code hier aufs wesentliche reduziert, damit es etwas übersichtlicher ist.

              Aus der Session wird dem User eine Gallerie seiner hochgeladenen Bilder erstellt. Gespeichert werden Bild-ID, Größe vorher, Größe nachher.

              Die erzeugten Bilder werden auf der Festplatte gespeichert. Das Skript wird nur bei neuen Uploads ausgeführt.

              Der Lasttest wurde mit 50 Usern und 100 Wiederholungen durchgeführt. Think-Times hatte ich nicht eingefügt.

              @robo47
              Für die installierten Pakete konnte ich keine relevanten Bugs finden. Bisher habe ich das Problem auf diese Stelle im Code reduziert. Auf dem Server laufen ebenfalls Crons mit Bildverarbeitung, die im Grunde genommen nichts großartig anderes machen. Hier kommt es jedoch nicht zu Problemen.

              @Tiberius
              Das weiß ich nicht genau, müsste ich nachgucken.

              Kommentar


              • #8
                Zitat von arthurdent Beitrag anzeigen

                @robo47
                Für die installierten Pakete konnte ich keine relevanten Bugs finden. Bisher habe ich das Problem auf diese Stelle im Code reduziert. Auf dem Server laufen ebenfalls Crons mit Bildverarbeitung, die im Grunde genommen nichts großartig anderes machen. Hier kommt es jedoch nicht zu Problemen.
                Der Unterschied ist wohl schon dass anstatt mod_php hier php-cli ( /usr/bin/php ) zum einsatz komt, bastel mal so ein script und lass das XXXX mal in einer schleife laufen und schau ob es via cli auch passiert, dann versuch es mit der php-cgi-binary (sollte unter debian /usr/bin/php-cgi sein) in der shell und danach bau nen vhost und nutze dort php-cgi (via php-info überprüfen ob es klappt) und schauen ob das problem auch auftritt.
                robo47.net - Blog, Codeschnipsel und mehr
                | Caching-Klassen und Opcode Caches in php | Robo47 Components - PHP Library extending Zend Framework

                Kommentar


                • #9
                  Danke, ich werde morgen dann noch einmal Tests laufen lassen und dann posten, ob und wie das Problem behoben wurde.

                  Kommentar


                  • #10
                    Ergebnis:

                    Das Skript ist so wie es ist völlig in Ordnung. Das Problem war ein anderes. Ich hatte die Lasttests zur Überprüfung nie bis zum Ende laufen lassen, da die Arbeitsspeicher-Nutzung immer weiter angestiegen ist. Das ist aber bei Linux-Servern ganz normal, da die Server den Speicher immer erst bei Bedarf wieder freigeben. Manchmal fängt man an Gespenster zu sehen. Vielen Dank für Eure Hilfe. Thema kann geschlossen werden.

                    Kommentar

                    Lädt...
                    X