Ankündigung

Einklappen
Keine Ankündigung bisher.

Memory Leak im EXEC Teil

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

    Memory Leak im EXEC Teil

    Hab da mal ne Frage...
    Ich hab potentiel ein Memory Leak in einem meiner Bausteine im Exec Teil.
    2017-04-11 06:49:02 472546 ? 26045 Datei: /usr/local/edomi/main/include/php/ModbusMaster.php | Fehlercode: 1 | Zeile: 151 | Allowed memory size of 67108864 bytes exhausted (tried to allocate 4431543 bytes) FATALERROR
    Jetzt hab ich das ganze etwas Umgebaut und der Exec Teil ist jetzt kein Daemon mehr sonder der LBS Teil ruft den Exec Teil periodisch auf.
    In meinem Jugendlichen Leichtsinn bin ich davon ausgegangen das damit alle potentiellen Memory Leaks im Keim erstickt wurden.
    Leider bekomme ich die Meldung immer noch ab und zu und weiß jetzt nicht so recht wie ich damit weiter machen soll.

    Lustigerweise lief der LBS über Wochen ohne Problem und ist jetzt plötzlich in den letzten Tagen fast täglich nachts ausgestiegen.

    Dabei hab ich doch gar nichts geändert (ich weiß das sagen sie immer... )

    Deshalb erstmal die Frage ob der Exec Teil beim beenden wirklich komplett freigegeben wird oder ob es da eventuel noch irgendwelche Referenzen gibt die man händisch auflösen müsste.
    Ich habe auch schon versucht großzügig "unset"s in the Code zu streuen aber das hat auch nicht wirklich geholfen...

    Jeder Input währe hilfreich
    Gruß
    Michael

    #2
    Ja der Speicher wird freigegeben, denn der EXEC Teil ist ein eigenständiger php Prozess. Wenn der beendet wird, dann ist der Speicher wieder verfügbar.
    Ich vermute eher, dass dein Skript mehr Speicher benötigt als erlaubt ist. Denn das Skript stößz an die grenze des erlaubten Speichers und nicht an die Grenze des verfügbaren Speichers. Und das Element was allokiert wird, ist ca. 4,5MB Groß. Bei einem Limit von 64MB ist natürlich schnell das Limit erreicht.

    Kommentar


      #3
      Hm, irgendwie seh ich nicht wie das passieren kann...

      Selbst wenn das modbus Objekt tatsächlich 4,5MB sein sollte (was ich nicht glaube) dann wird es in dem EXEC Teil maximal 5mal aufgerufen.
      Dabei wird es immer wieder überschrieben:
      PHP-Code:
      $modbus = new ModbusMaster($E[2]['value'], ($E[4]['value']=="UDP" "TCP")); 
      Sollte also nicht mehr Speicher verbauchen...

      Ich bin sicher irgendwo ist der Wurm drin aber im Moment komm ich nicht weiter.
      Das einzige was ich irgendwo mal gelesen hatte die letzten Tage ist das PHP ein Problem mit IIF Konstrukten hätte aber bei sowas primitiven wie oben will ich das fast nicht glauben.

      Hab mir gerade noch mal den Code zu Gemüte geführt... Die obige Zeile wird nur einmal ausgeführt, ist außerhalb des Loops...
      Gruß
      Michael

      Kommentar


        #4
        In der ModbusMaster Klasse kann auch ein Memoryleak sein. Ein Überschreiben gibt dabei dann nicht unbedingt den Speicher wieder frei. Wenn es Zirkelbezüge innerhalb des Objektes gibt, dann verhindert dies die Freigabe des allokierten Speichers, selbst wenn es mit unset($var); explizit freigegeben wird.

        Schreib doch einfach mal die Speicherbelegung am Anfang des Skripts und nach jedem "new" in ein Log, dann kannst du vermutlich sehen, wie der Speicherverbrauch steigt. Wenn dem so ist, dann liegts an der ModbusMaster Klasse. Ist die denn von dir oder ist es eine externe Library?

        Kommentar


          #5
          Werde ich später mal probieren. Aber trotzdem sollte doch eigendlich der wenn der Exec Teil fertig ist alles aus dem Speicher fliegen...

          Da der LBS alle Sekunde triggert sollte das Problem recht häufig auftreten tut es aber nicht.
          Nach dem es heute nacht aber wieder passiert ist fiel mir auf das es immer ungefähr zur gleichen Zeit passiert!
          ca 6:45+-5min... das kann ja wohl kein Zufall sein.
          Läuft um diese Zeit irgend etwas in Edomi?
          Gruß
          Michael

          Kommentar


            #6
            Nicht das ich wüßte.
            Welcher LBS ist es denn? Kann es sein, dass es eher am Kommunikationspartner gegenüber liegt, dass der um 6.45 +/- 5 irgendwas machst, was dann dem LBS nicht gefällt? Wie lang ist denn die normale Ausführungszeit des Skripts? Du triggerst das EXEC Skript ja regelmäßig. Stellst du sicher, dass der letzte Aufruf schon fertig ist, bevor du den nächsten startest?

            Kommentar


              #7
              Das Gegenstück ist meine PV Anlage, kann mir nicht vorstellen was die da machen sollte...
              Das der Exec Teil nur einmal läuft stelle ich über eine Variable sicher, deswegen sehe ich auch das nach dem Fehler der LBS "steht" weil der Exec Teil sich nicht richtig abgemeldet hat.

              Ist mein ModbusReader LBS 19001030.

              Eigentlich müsste das ja heißen das es gar kein Memory Leak gibt sonder der Exec Teil sich irgendwie um diese Zeit "verschluckt" und dann Speicher verbraucht bis er gekillt wird...
              Leider passiert das alles in einer externen Lib und die wollte ich nicht unbedingt debuggen
              Gruß
              Michael

              Kommentar


                #8
                Sonnenaufgang 6.30 Uhr momentan, Fehler um 6.45 Uhr, vielleicht schickt die Solaranlage was komisches, wenn sie das erste Mal Strom produziert?
                Grüße
                Matze

                Kommentar


                  #9
                  Hm, das ist ein interessanter Gedanke.
                  Ich werde mal per ZSU um 6:30 das Logging hoch drehen und schauen was passiert.
                  Gruß
                  Michael

                  Kommentar


                    #10
                    Spielt Edomi automatisch irgendwelche Distributions Pakete ein bzw aktualisisert diese?
                    Mir ist aufgefallen das sich ein zweiter LBS von mir komisch verhält and daran hat sich auch schon länger nichts mehr geändert...
                    Irgendwie merkwürdig das plötzlich Probleme an verschiedenen Stellen auftauchen
                    Gruß
                    Michael

                    Kommentar


                      #11
                      Zitat von gulp2k Beitrag anzeigen
                      Spielt Edomi automatisch irgendwelche Distributions Pakete ein bzw aktualisisert diese?
                      Mir ist aufgefallen das sich ein zweiter LBS von mir komisch verhält and daran hat sich auch schon länger nichts mehr geändert...
                      Irgendwie merkwürdig das plötzlich Probleme an verschiedenen Stellen auftauchen
                      Nein, ich denke nur, wenn du das explizit machst oder EDOMI updatest.

                      Kommentar


                        #12
                        So, war ja klar das der LBS heute morgen durch lief...
                        Die gute Nachricht ist aber das ich auf Grund des Loggings der Speicherauslastung ein generelles Memory Leak jetzt ausschließen kann.
                        Der Wert ist relative Konstant +- ein paar 100 Bytes.

                        Die Theorie das die PV Anlage etwas komisches bei Sonnenaufgang macht gewinnt somit an Gewicht.

                        Nachdem ich jetzt den "normalen" Speicherverbrauch kenn werd ich mal heute noch ein "Notfall" Logging bei erhöhtem Verbrauch einbauen.
                        Vielleicht komm ich damit der Sache auf die Spur bevor der Prozess hart beendet wird...
                        Gruß
                        Michael

                        Kommentar

                        Lädt...
                        X