André: PHP Problem - ImageMagick

Hallo,

wisst ihr zufällig was diese Meldung bedeutet?

"libgomp: Thread creation failed: Resource temporarily unavailable"

Einige User schreiben mich seit gestern an, dass keine Bilder mehr hochgeladen werden können. Ich sehe auf dem Server dass die Bilder ordnungsgemäß ankommen, allerdings werden diese im Ordner _generate nicht mehr kleingerechnet.

Ich nutzte das Tool ImageMagick

In den Serverlogs steht lediglich folgendes:

  1. [Thu Feb 25 22:31:13 2016] [error] [client xx.xxx.xxx.xxx] libgomp: Thread creation failed: Resource temporarily unavailable

  2. [Thu Feb 25 22:31:13 2016] [error] [client xx.xxx.xxx.xxx] PHP Warning: file_get_contents(/data/www/xx/xxx/html/img/_generate/inserat/2016/02/testdatei.w80.h60.jpg): failed to open stream: No such file or directory in /data/www/xx/xxx/html/img/_generate/ScalerIM.php on line 232

In der ScalerIM.php steht in Zeile 232 folgedes

print file_get_contents($this->OutputFile);

Die ganze Funktion lautet (paar Zeilen höher und ein paar Zeiler weiter runter)

    public function printToScreen()
    {
        if (headers_sent())
            throw new Exception('Headers allready sent');

        if ($this->Debug) {
            print $this->getDebug();
            return true;
        }

        header('Content-Type: image/jpeg');

        print file_get_contents($this->OutputFile);
    }

Könnt ihr euch dieses Problem erklären oder mir ein Tipp geben, wo ich nachschauen muss? Liegt es vielleicht am Server? Kann ich da irgendwo nachschauen?

Ach ja, ich habe nichts an den Scripten geändert.

  1. Moin!

    Ach ja, ich habe nichts an den Scripten geändert.

    1. Kann gut sein, dass da ein anderer für Dich getan hat. "Bild"uploadscripte, welche den content-Typ der angeblichen Grafiken nicht genügend prüfen (Ich weiß nicht, was da stattfindet) sind derzeit eines der Lieblingsspielzeuger der Hacker.

    2. Ist denn noch Platz auf der Platte? Greift eine Limit (quota)? Das syslog gibt Auskunft.

    Erste Prüfung mit

    <?php
    header('content-type:text/plain');
    echo `df -h`;
    

    Jörg Reinholz

    1. Hallo Jörg,

      1. Ist denn noch Platz auf der Platte? Greift eine Limit (quota)? Das syslog gibt Auskunft.

      Die Meldung, die da gequotet wurde, lässt nicht auf Plattenplatz-Probleme rückschliessen.

      LG,
      CK

      1. Moin!

        Die Meldung, die da gequotet wurde, lässt nicht auf Plattenplatz-Probleme rückschliessen.

        Ich habe jetzt den Quelltext von libgomp noch nicht so weit durchgesehen um das genau zu wissen: Aber mit überwiegender Wahrscheinlichkeit hast Du recht.

        Jörg Reinholz

    2. Moin,

      1. Kann gut sein, dass da ein anderer für Dich getan hat. "Bild"uploadscripte, welche den content-Typ der angeblichen Grafiken nicht genügend prüfen (Ich weiß nicht, was da stattfindet) sind derzeit eines der Lieblingsspielzeuger der Hacker.

      könnte das der Virus Locky sein, derzeit in aller Munde ist?

      1. Ist denn noch Platz auf der Platte? Greift eine Limit (quota)? Das syslog gibt Auskunft.

      Dürfte kein Problem sein, hab geschaut insgesamt ist das ganze Projekt 10 GB rein, also recht überschaubar. Plattenplatz habe ich 60 GB

      Erste Prüfung mit

      <?php
      header('content-type:text/plain');
      echo `df -h`;
      

      Wo muss ich das Script ausführen? Lege ich es in mein Verzeichnis und rufe dieses auf erhalte ich eine weiße Seite mit HTML Quelltext.

      1. Moin!

        Erste Prüfung mit

        (Ergänzt:)

        <?php
        header('content-type:text/plain');
        echo `df -h`;
        echo "\n-----------------------------------------------------------------\n";
        echo `ulimit -a`;
        

        Wo muss ich das Script ausführen? Lege ich es in mein Verzeichnis und rufe dieses auf erhalte ich eine weiße Seite mit HTML Quelltext.

        Alternativ-Text

        Sowas?

        Jörg Reinholz

        1. Moin,

          Sowas?

          Alternativ-Text

          Ich hoffe ich bekomme von meinem Provider kein Ärger, dass ich diese Daten veröffentliche. Sollte es zu gefährlich sein, bitte ich die Admins das Bild wieder zu löschen. Ich kann mit den Zahlen nichts anfangen.

          1. Moin!

            Moin,

            Sowas?

            Alternativ-Text

            Ich hoffe ich bekomme von meinem Provider kein Ärger, dass ich diese Daten veröffentliche.

            Wieso denn?

            Hm. Maximal 16 user-Prozesse. Das ist "dünn".

            Jörg Reinholz

            1. Moin,

              Wieso denn?

              ich weiß ja nicht was die Zahlen bedeuten, nicht dass ich hier etwas Sicherheitsrelevantes veröffentliche und mein Hoster irgendwelche Angriffe abbekommt.

              Hm. Maximal 16 user-Prozesse. Das ist "dünn".

              ALso kein guter Hoster?

              1. Moin!

                Hm. Maximal 16 user-Prozesse. Das ist "dünn".

                ALso kein guter Hoster?

                Das kann man allein aus den hier bekannt gewordenen Umständen nicht entnehmen.

                Teste mal das hier:

                <?php
                header('content-type:text/plain');
                echo `ulimit -a`;
                echo "\n-----------------------------------------------------------------\n";
                $uid=getmyuid();
                echo `ps -u $uid`;
                

                Jörg Reinholz

  2. Hallo André,

    "libgomp: Thread creation failed: Resource temporarily unavailable"

    Das hört sich danach an, als sei ein ulimit überschritten worden. Was sagt denn ulimit -a? Es könnte der Thread-Stacksize sein, es könnte aber auch einfach die Anzahl der Threads selber sein. Da musst du mal genauer hinschauen: wieviele Threads gibt es denn? (ps -eLf hilft dir weiter) Wie ist deine Thread Stack Size? (siehe ulimit -a). Wie ist dein Thread limit? (wieder ulimit -a)

    LG,
    CK

    1. Hallo Christian,

      Das hört sich danach an, als sei ein ulimit überschritten worden. Was sagt denn ulimit -a? Es könnte der Thread-Stacksize sein, es könnte aber auch einfach die Anzahl der Threads selber sein. Da musst du mal genauer hinschauen: wieviele Threads gibt es denn? (ps -eLf hilft dir weiter) Wie ist deine Thread Stack Size? (siehe ulimit -a). Wie ist dein Thread limit? (wieder ulimit -a)

      was mich etwas wundert, es gibt keine Threads, oder ist damit die Anzahl der Bilder gemeint? Wenn ja, das sind mehrere tausend. Insgesamt hat das Projekt ca. 10 GB.

      10 GB an Bilder dürfte doch für ein Server nicht viel sein?

      Was meinst du mit ulimit -a ich habe nur Webspace ohne Putty oder Consolen Zugriff.

      1. Moin!

        Was meinst du mit ulimit -a ich habe nur Webspace ohne Putty oder Consolen Zugriff.

        Das vorausahnend hatte ich die Konsolenbefehle in php verpackt, es kann aber gut sein, dass die Dir auch verboten sind.

        Insgesamt hat das Projekt ca. 10 GB

        ich habe nur Webspace ohne Putty oder Consolen Zugriff.

        Wenn der Hoster Dir nicht auch den Popo wischt ist bei dieser Größe der Zugriff via ssh schon unumgänglich. Zur Not kannst Du ja mal in den Vertrag schauen, was da zum Speichervolumen steht. In der Rehel musst Du mit irendwelchen Problemen rechnen, wenn Du die Limits des Hosters ausreizt. Hier womöglich die Anzahl maximaler Threads oder des zur Verfügung stehenden Arbeitsspeichers.

        Mit dem Hoster reden, größeres Paket, vserver (in deinem Fall wohl ein "Managed Server") oder was auch immer.

        Jörg Reinholz

  3. Hallo,

    ich bin über meine Suchmaschine auf folgende Seite gestoßen: https://www.profihost.com/forum/webhosting/imagemagick-graphicsmagick-generiert-keine-bilder/

    Der Beitrag ist zwar schon zwei Jahre alt, habe die zwei Zeilen Code die im Beitrag geanntn werden in meine ScalerIM.php ganz an den Anfang eingefügt und siehe da, es läuft (zumindest bei mir).

    Was die zwei Zeilen genau bedeuten, keine Ahnung.

    1. Moin!

      Was die zwei Zeilen genau bedeuten, keine Ahnung.

      putenv("MAGICK_THREAD_LIMIT=1");
      putenv("OMP_NUM_THREADS=1");
      

      Image magic liest aus den frisch gesetzten Umgebungsvariablen, dass es sparsam mit dem Erstellen von Threads (kann man als "parallel laufende Prozesse" bezeichnen) sein soll. Viele Programme werden über Umgebungsvariablen gesteuert, dass man das unter PHP benutzt ist aber eher selten.

      Bei einem starken Besucheransturm kann das Problem dennoch wieder auftreten.

      Jörg Reinholz

      1. Moin,

        Image magic liest aus den frisch gesetzten Umgebungsvariablen, dass es sparsam mit dem Erstellen von Threads (kann man als "parallel laufende Prozesse" bezeichnen) sein soll. Viele Programme werden über Umgebungsvariablen gesteuert, dass man das unter PHP benutzt ist aber eher selten.

        danke für deine Erklärung. Liegt dieses also am Server, dass dieser mit der Last nicht klar kommt, oder sind in den Ordner einfach zu viele Bilder? Wenn letztes dann wäre jetzt der richtige Zeitpunkt mal kräftig aufzuräumen.

        Bei einem starken Besucheransturm kann das Problem dennoch wieder auftreten.

        Meine Webseite hat vielleicht pro Tag 20 - 30 Besucher, davon ist einer, der ein Inserat anlegt. Also von vielen Besuchern kann man hier nicht reden. Die vorhin genannten 10 GB sind jetzt seit 2009 angewachsen.

        1. Moin!

          Liegt dieses also am Server, dass dieser mit der Last nicht klar kommt, oder sind in den Ordner einfach zu viele Bilder? Wenn letztes dann wäre jetzt der richtige Zeitpunkt mal kräftig aufzuräumen.

          Liegt nicht am Server. Aber auf dem Server sind viele Kunden, die jeweils nur "kleines Geld" zahlen. Hier was zu den Kosten (unter Einkaufskosten mal konkret")

          Um jetzt die anderen Kunden davor zu schützen, dass einer allein die ganze Serverlast verbrät und das deshalb deren Webseiten nicht abgerufen werden können, werden eben pro Benutzer (=Kunde) Limits gesetzt. Und die hattest Du "gerissen". Das liegt aber auch nicht an der Anzahl der Bilder sondern (wahrscheinlich) an der Anzahl der gleichzeitigen Prozesse - die wieder ist vom Ansturm der Besucher abhängig und schwankt ergo sehr stark.

          Mit dem Skript kann man das durchaus sehen... Man verbraucht aber selbst für kurze Zeit (ein paar Millisekunden) einen Prozess.

          Jörg Reinholz

          1. Moin,

            Um jetzt die anderen Kunden davor zu schützen, dass einer allein die ganze Serverlast verbrät und das deshalb deren Webseiten nicht abgerufen werden können, werden eben pro Benutzer (=Kunde) Limits gesetzt. Und die hattest Du "gerissen". Das liegt aber auch nicht an der Anzahl der Bilder sondern (wahrscheinlich) an der Anzahl der gleichzeitigen Prozesse - die wieder ist vom Ansturm der Besucher abhängig und schwankt ergo sehr stark.

            Wahnsinn was für Kosten ein Webhoster hat.

            Mit dem Skript kann man das durchaus sehen... Man verbraucht aber selbst für kurze Zeit (ein paar Millisekunden) einen Prozess.

            Sorry, habe ich total übersehen. Diese Ausgabe erhalte ich:

            Alternativ-Text

            1. Moin!

              Sorry, habe ich total übersehen. Diese Ausgabe erhalte ich:

              Alternativ-Text

              Ja, klar. Ist grad nichts los auf dem Server… Mehr Besucher, mehr Prozesse.

              Jörg Reinholz

              1. Moin,

                Ja, klar. Ist grad nichts los auf dem Server… Mehr Besucher, mehr Prozesse.

                ich schau mir dieses mal gegen Nachmittag an, dann müsste auf dem Server definitiv mehr los sein. Ich melde mich später wieder. Danke für deine Hilfe und einen schönen Abend.