Ankündigung

Einklappen
Keine Ankündigung bisher.

95% Auslastung

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

    95% Auslastung

    Seit Heute lauft Edomi sehr zäh. Das setzen eines internen KO dauert schon mal 20sec.

    top auf dem Server liefert 63% Last bei mysql und 26% bei php

    Wie kann ich den Verursacher ermitteln?


    Zuletzt geändert von hartwigm; 05.02.2017, 15:02.
    Gruß Hartwig

    #2
    Könnte eine Logikschleife sein, die bekommst du nur raus wenn du einzelne Logikseiten deaktivierst

    Kommentar


      #3
      in top mal "c" drücken, dann siehst du zumindest, ob es eine Logikschleife intern oder ein LBS ist.
      Du kannst im ersten Widget rechts neben der Hauptansicht sehen, welche KOs wann zuletzt gesetzt wurden.
      Wenn es eine Logikschleife gibt, dann sollte es hier eigentlich sichtbar sein, durch welches KO dies ausgelöst wird.

      Screenshot from 2017-02-05 13-05-43.png

      Kommentar


        #4
        Ich fürchte mal dass es mein erste eingestellter Logikbaustein ist. (19000970)

        Kannst Du mir bei der Interpretation der Screenshots helfen? Daraus kann ich nicht ablesen, wo ich weiter suchen muß.

        perf1.PNGperf2.PNG
        Angehängte Dateien
        Gruß Hartwig

        Kommentar


          #5
          proc_logic.php
          Das sieht nach einer Logik-Schleife aus. Hatte ich auch grade erst mit den gleichen Symptomen.
          Wie André schon geschrieben hat: Einfach mal nacheinander die Logikseiten deaktivieren. Bzw. wohl am ehesten die, an der du zuletzt gearbeitet hast.

          Dann einfach mal schauen welche KOs zu in der Logik setzt, bzw. welche Ausgänge du ggf. mit LBS Eingängen verdrahtet hast.
          Irgendwo wird wahrscheinlich durch einen Ausgang ein Eingang immer wieder getriggert.

          Kommentar


            #6
            Jetzt brauche ich mal Eure Hilfe

            Der Fehler liegt an meinem eigenen Baustein.
            Das ist der erste Baustein mit einem Timer, und vermutlich liegt auch daran der Fehler. Ich sehe ab den Wald vor lauter Bäumen nicht!

            Eine Schleife mit einem anderen Baustein kann ich ausschließen. Er reicht den Baustein in eine Logikseite zu nehmen und schon geht die Last bis auf 90%

            Der Baustein tut was er soll und funktioniert auch, mit dem Nebeneffekt, dass er massive Last produziert.

            Könnt Ihr mir hier sagen warum, wo der Fehler liegt!
            Ansonsten müsste ich den Baustein mal umbenennen auf "Lasttester". 2 Stück aktivieren und 100% CPU Last ist gewiß!

            Konstruktive Kritik ist ausdrücklich gewünscht!


            PHP-Code:
            ###[DEF]###
            [name = Anwesenheit Plus 0.2]

            [e#1    trigger        = BWG durch PM    ]
            [e#2    important    = Timeout f�r Anwesend #init=5 ]
            [e#3    important    = Timeout f�r Abwesend #init=120]
            [e#4    important    = Starten #init=1]
            [e#5    option        =Zykluszeit LBS in ms #init=1000]

            [a#1        =    Status Anwesend]
            [a#2        =     Anwesend seit sec]
            [a#3        =     Abwesend seit sec]
            [a#4        =   An-Abwesenheitszeit #/-]
            [a#5        =     LBS aktiv]

            [v#1=]  Startzeit
            [v#2=]  Anwesend
            [v#3=]  Akt_status
            ###[/DEF]###
            ###[HELP]###
            Vorlage : Standard - LBS
            ###[/HELP]###
            Der Baustein dient dazu um Licht oder Musiksteuerung abhänngig von An - Abwesenheitszeiten zu schalten
            E1 : Trigger
            E2 : Timeout in sec .
            Wenn E1 länger als diese Zeit auf 1 steht wird Anwesenheit A1 geschaltet und der Timer für die Anwesenheit läft
            E3 : wie E2 für Abwesenheit
            E4 : Start des LBS default ist 1
            E5 : Zykluszeit des LBS

            A1 : 0 / 1 unter Berücksichtigung des Timeouts
            A2 : Anwesenheitsdauer in sec . nach Timeout springt z . B bei einem Timeout von 60 sec von 0 auf 60 nach Ablauf des Timeouts
            A3 : wie A4
            A4 : Vereint A3 / A4 in einem Ausgang += Anwesend seit -= Abwesend seit
            A5 : Status 0.1 Initiale Version 0.1 a Fehler undefinierte Variable gefixt

            0.1 initiale Version
            0.2 Umstellung der statischen Variablen auf Interne

            ###[LBS]###
              <?
              function LB_LBSID($id) {
                if ($E = logic_getInputs($id)) {

                  if (logic_getState($id) == 0) { //LBS nicht aktiviert
                    if ($E[4]['value'] == 1 && $E[4]['refresh'] == 1) {
                      logic_setState($id, 1); //LBS "starten"
                    }
                  } else {
                    //ggf. ausschalten
                    if ($E[4]['value'] == 0 && $E[4]['refresh'] == 1) {
                      logic_setState($id, 0); //LBS "aus
                    }
                  }

                  // Status auswerten wenn Baustein aktiv
                  logic_setOutput($id, 5, logic_getState($id));      //Ausgabe Baustein läuft
                  if (logic_getState($id) == 1) { //nur wenn Timer läuft
                    if ($E[1]['refresh']) { //nur wenn der Status sich ändert
                      if (intval($E[1]['value']) == 0) { //abwesend
                        logic_setVar($id, 1, getMicrotime());
                        logic_setVar($id, 2, 0);       //Abwesend
                      } else { //anwesend
                        logic_setVar($id, 1, getMicrotime());
                        logic_setVar($id, 2, 1);       //Anwesend
                      }
                    }

                    if (logic_getVar($id, 1) != 0) {
                      $differenz = intval((getMicrotime() - logic_getVar($id, 1))); //in sec
                    } else {
                      $differenz = 0;
                    }

                    if (logic_getVar($id, 2) == 1 && $differenz >= $E[2]['value']) { //anwesend und Zeit>Schwellwert
                        //Ausgabe der Zeit
                      if (logic_getVar($id, 3) == "anwesend") {  //wurde schon gesetzt, daher nur die neuen Werte ausgeben
                        //nur noch die Differenz ausgeben
                        logic_setOutput($id, 4, $differenz);
                        logic_setOutput($id, 2, $differenz);
                      } else {
                        logic_setOutput($id, 1, 1);
                        logic_setOutput($id, 2, $differenz);
                        logic_setOutput($id, 3, 0);
                        logic_setOutput($id, 4, $differenz);
                        logic_setVar($id, 3, "anwesend");
                      }
                    } elseif (logic_getVar($id, 2) == 0 && $differenz >= $E[3]['value']) {
                      if ($akt_status == "abwesend") {
                        // nur Differenz
                        logic_setOutput($id, 3, $differenz);
                        logic_setOutput($id, 4, $differenz * - 1);
                      } else {
                        logic_setOutput($id, 1, 0);
                        logic_setOutput($id, 3, $differenz);
                        logic_setOutput($id, 2, 0);
                        logic_setOutput($id, 4, $differenz * - 1);
                        logic_setVar($id, 3, "abwesend");
                      }
                    }
                  }
                }
            }
            ?>
            ###[/LBS]###


            ###[EXEC]###
            <?
            ?>
            ###[/EXEC]###
            Gruß Hartwig

            Kommentar


              #7
              Hallo Hartwig,
              vielleicht ist es nur der Help Marker ###[/HELP]###

              Kommentar


                #8
                Ich habe noch nicht ganz verstanden, was genau der LBS machen soll, aber das

                PHP-Code:
                logic_setState($id1); 
                bewirkt, dass der LBS so schnell wir möglich wieder aufgerufen wird und zwar solange bis es wieder auf 0 gesetzt wird.
                Und bei jedem Aufruf werden offensichtlich einige Ausgänge gesetzt, d.h. letztendlich vielleicht 20x pro Sekunde 5 Ausgänge setzen => >=100 DB Abfragen

                Um jetzt sagen zu können, wie man es besser machen könnte, müsste ich allerdings verstehen, was genau der LBS machen soll.

                Kommentar


                  #9
                  hartwigm Ist da nicht eigentlich der BS 15000100 eher was für Dich? Wäre auch im Lieferumfang..

                  Kommentar


                    #10
                    Ziel des Bausteins soll es sein, dass an den Ausgängen
                    A2: die Zeit in sec anliegen soll, seit wann jemand in dem Raum ist
                    A3: die Zeit in sec. seit wann keine Bewegung mehr in dem Raum war

                    Über E2/E3 ist ein Timeout für Anwesenheit/Abwesenheit zu setzen. Mit Überschreiten diese Timeout wird geschaltet.

                    Zweck:
                    Ich brauche für das ZU- Abschalten der Musik Raumbezogen die Zeit seit wann jemand im Raum ist bzw. seit wann niemand mehr da ist.

                    z.B. in meinem Büro nach 240sec wird die Musik angeschaltet, nach 360sec ohne Bewegung geht dies aus.
                    z.B. Toiletten nach 5sec geht Musik an nach 120sec wieder aus.

                    logic_setState hatte ich bislang so gesetzt gehabt

                    logic_setState($id,1,2,$E[5]['value']);

                    da konnte ich aber keine Änderung feststellen.

                    Gruß Hartwig

                    Kommentar


                      #11
                      hartwigm Nimm doch den HKLS Kanal vom Bewegungsmelder dafür. Die sollten doch noch nicht benutzt sein.

                      Kommentar


                        #12
                        Micha, ein interessanter Baustein, den ich so noch nie auf dem Radar hatte, aber in dem Fall brauche ich die Zeitfaktoren. Wobei ich diese nicht Sekundengenau brauche, deswegen auch der Versuch über E[5]
                        Gruß Hartwig

                        Kommentar


                          #13
                          Versuch mal folgendes und setze mal E5 auf 500:

                          (Änderungen in rot)

                          Code:
                          ###[DEF]###
                          [name = Anwesenheit Plus 0.2]
                          
                          [e#1 trigger = BWG durch PM ]
                          [e#2 important = Timeout f�r Anwesend #init=5 ]
                          [e#3 important = Timeout f�r Abwesend #init=120]
                          [e#4 important = Starten #init=1]
                          [e#5 option =Zykluszeit LBS in ms #init=1000]
                          
                          [a#1 = Status Anwesend]
                          [a#2 = Anwesend seit sec]
                          [a#3 = Abwesend seit sec]
                          [a#4 = An-Abwesenheitszeit #/-]
                          [a#5 = LBS aktiv]
                          
                          [v#1=] Startzeit
                          [v#2=] Anwesend
                          [v#3=] Akt_status
                          ###[/DEF]###
                          ###[HELP]###
                          Vorlage : Standard - LBS
                          ###[/HELP]###
                          Der Baustein dient dazu um Licht oder Musiksteuerung abhänngig von An - Abwesenheitszeiten zu schalten
                          E1 : Trigger
                          E2 : Timeout in sec .
                          Wenn E1 länger als diese Zeit auf 1 steht wird Anwesenheit A1 geschaltet und der Timer für die Anwesenheit läft
                          E3 : wie E2 für Abwesenheit
                          E4 : Start des LBS default ist 1
                          E5 : Zykluszeit des LBS
                          
                          A1 : 0 / 1 unter Berücksichtigung des Timeouts
                          A2 : Anwesenheitsdauer in sec . nach Timeout springt z . B bei einem Timeout von 60 sec von 0 auf 60 nach Ablauf des Timeouts
                          A3 : wie A4
                          A4 : Vereint A3 / A4 in einem Ausgang += Anwesend seit -= Abwesend seit
                          A5 : Status 0.1 Initiale Version 0.1 a Fehler undefinierte Variable gefixt
                          
                          0.1 initiale Version
                          0.2 Umstellung der statischen Variablen auf Interne
                          
                          ###[LBS]###
                          <?
                          function LB_LBSID($id) {
                          if ($E = logic_getInputs($id)) {
                          
                          if (logic_getState($id) == 0) { //LBS nicht aktiviert
                          if ($E[4]['value'] == 1 && $E[4]['refresh'] == 1) {
                          [COLOR=#FF0000]//logic_setState($id, 1); //LBS "starten"
                          logic_setState($id,1,$E[5]['value'],true);[/COLOR]
                          }
                          } else {
                          //ggf. ausschalten
                          if ($E[4]['value'] == 0 && $E[4]['refresh'] == 1) {
                          logic_setState($id, 0); //LBS "aus
                          } [COLOR=#FF0000]else logic_setState($id,1,$E[5]['value'],true);[/COLOR]
                          }
                          
                          // Status auswerten wenn Baustein aktiv
                          logic_setOutput($id, 5, logic_getState($id)); //Ausgabe Baustein läuft
                          if (logic_getState($id) == 1) { //nur wenn Timer läuft
                          if ($E[1]['refresh']) { //nur wenn der Status sich ändert
                          if (intval($E[1]['value']) == 0) { //abwesend
                          logic_setVar($id, 1, getMicrotime());
                          logic_setVar($id, 2, 0); //Abwesend
                          } else { //anwesend
                          logic_setVar($id, 1, getMicrotime());
                          logic_setVar($id, 2, 1); //Anwesend
                          }
                          }
                          
                          if (logic_getVar($id, 1) != 0) {
                          $differenz = intval((getMicrotime() - logic_getVar($id, 1))); //in sec
                          } else {
                          $differenz = 0;
                          }
                          
                          if (logic_getVar($id, 2) == 1 && $differenz >= $E[2]['value']) { //anwesend und Zeit>Schwellwert
                          //Ausgabe der Zeit
                          if (logic_getVar($id, 3) == "anwesend") { //wurde schon gesetzt, daher nur die neuen Werte ausgeben
                          //nur noch die Differenz ausgeben
                          logic_setOutput($id, 4, $differenz);
                          logic_setOutput($id, 2, $differenz);
                          } else {
                          logic_setOutput($id, 1, 1);
                          logic_setOutput($id, 2, $differenz);
                          logic_setOutput($id, 3, 0);
                          logic_setOutput($id, 4, $differenz);
                          logic_setVar($id, 3, "anwesend");
                          }
                          } elseif (logic_getVar($id, 2) == 0 && $differenz >= $E[3]['value']) {
                          if ($akt_status == "abwesend") {
                          // nur Differenz
                          logic_setOutput($id, 3, $differenz);
                          logic_setOutput($id, 4, $differenz * - 1);
                          } else {
                          logic_setOutput($id, 1, 0);
                          logic_setOutput($id, 3, $differenz);
                          logic_setOutput($id, 2, 0);
                          logic_setOutput($id, 4, $differenz * - 1);
                          logic_setVar($id, 3, "abwesend");
                          }
                          }
                          }
                          }
                          }
                          ?>
                          ###[/LBS]###
                          
                          
                          ###[EXEC]###
                          <?
                          ?>
                          ###[/EXEC]###

                          Kommentar


                            #14
                            Mit logic_setState($id,1,2,$E[5]['value']); hatte ich auch in den letzten Tagen gearbeitet und konnte da immer nur einmalig das Delay feststellen.
                            Jeder weitere Durchlauf der Logik ignorierte das Delay und lief damit 'so oft wie möglich'.
                            Auch wenn ich als 4. Parameter ein true übergebe oder das logic_setState($id,1,2,$E[5]['value']); in jedem Durchlauf erneut setze.

                            Ich habe dann z.B. im Telegrammgenerator LBS gesehen, dass hier immer getMicrotime gearbeitet wurde, um den nächsten Auslösetermin für den LBS zu ermitteln.
                            Muss man das so wie im Telegrammgenerator LBS machen? Und für welchen Zweck ist der 4. Parameter in logic_setState?

                            Viele Grüße,
                            Tim

                            Kommentar


                              #15
                              PHP-Code:
                              logic_setState($id,1,2,$E[5]['value']); 
                              Das ist ja auch die falsche Reihenfolge. Der dritte Parameter gibt die Zeit in ms an, der vierte ob es nur einmalig oder immer verwendet werden soll.

                              Wenn man genaue Werte haben möchte, dann kann man das so machen wie im Telegrammgenerator. Wenn das nicht gefordert ist, dann sollte das eigentlich mit dem Intervall des logic-setState() ausreichen.

                              PHP-Code:
                              logic_setState($id,1,500,true); 
                              würde also den LBS also ungefähr zweimal pro Sekunde aufrufen. Ich wüsste jetzt keinen Grund warum das nicht funktionieren sollte.
                              Zuletzt geändert von jonofe; 06.02.2017, 15:14.

                              Kommentar

                              Lädt...
                              X