Ankündigung

Einklappen
Keine Ankündigung bisher.

Item mit Zeitberechnung bspw für Verbrauchsauswertung als Systemitems bereitstellen

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

    #31
    Zitat von kaiwerner Beitrag anzeigen
    In der Tasks werden auch nur DB-Abfragen ausgewertet, das sollte keine Ewigkeiten brauchen.
    Doch, genau das. Wenn die zeitgleich angestossen werden sollen und alle Datenbank Abfragen starten dann behindern sich die Abfragen unter Umständen schon gegenseitig...

    Kommentar


      #32
      Ein Ansatzpunkt wäre, genau wie weiter oben in diesem Thread beschrieben, die Berechnungen in einem Task auszuführen (da die Berechnungen alle zeitgleich stattfinden sollen), statt für jede Berechnung
      - zu prüfen, ob ein Worker-Thread idle ist und falls ja einen Thread zu selektieren und aus der Liste der idle Threads zu entfernen
      - oder evtl. einen neuen Thread zu starten
      - den Worker-Thread aufzusetzen
      - die einzelne Berechnung durchzuführen
      - den Thread in die Liste der idle Threads aufzunehmen

      Die gesamten Berechnungen die zeitgleich ausgeführt werden sollen, könnte man in eine Logik packen und diese per crontab starten (das wäre dann im Idealfall 1 Thread statt 60). Das spart in Summe auch Rechenzeit, da das gesamte Worker-Handling nur 1 mal statt 60 mal durchgeführt werden muss.

      Zitat von kaiwerner Beitrag anzeigen
      Ich hatte vor den Änderungen immer so um die 60 Worker-Threads und keine Probleme damit. Diese haben sich genau wie jetzt, nach einem Neustart, einer nach dem anderen Aufgebaut. Aber halt da eingependelt.
      Eine andere (bewusst nicht groß dokumentierte) Möglichkeit könntest Du nutzen, da bei Deiner Hardwareausstattung und Task Beschaffenheit wie Du schreibst 60 Tasks kein Problem darstellen, ist es die Anzahl Worker-Threads bei der ein Restart ausgeführt wird zu erhöhen.

      Dazu kannst Du in ../etc/smarthome.yaml folgenden Eintrag vornehmen, um den Restart z.B. erst bei 45 Workern vorzunehmen:
      Code:
      restart_on_num_workers: 45
      Viele Grüße
      Martin

      There is no cloud. It's only someone else's computer.

      Kommentar


        #33
        Danke für den Tipp den Wert zu überschreiben. Soweit habe ich wieder mal nicht gedacht. Läuft bei mir in einen VM. Da ist Luft nach oben.

        Werde mir die Sache mit einer Logik aber mal ansehen.
        Ich finde sehr übersichtlich, wenn crontab Definition an einem Item bzw. an einem Itemstruct ist. Das würde dann ja entfallen.

        Wo ich aber noch auf dem Schlauch sehe ist, warum nur alle 60 Sekunden ein neuer Worker erzeugt wird, wenn er benötig wird.
        Code:
        now = self.shtime.now()
          if self._runq.qsize() > len(self._workers):
            delta = now - self._last_worker
            if delta.seconds > self._worker_delta:
              if len(self._workers) < self._worker_max:
                 self._add_worker()
        Was ist der Grund dafür? Um Spitzen auszugleichen?
        Zuletzt geändert von kaiwerner; 23.06.2020, 15:02.

        Kommentar


          #34
          Zitat von kaiwerner Beitrag anzeigen
          Danke für den Tipp den Wert zu überschreiben.
          Nicht überschreiben, setzen. Der Wert ist in der smarthome.yaml normalerweise nicht gesetzt. Dann wird 30 angenommen.
          Zitat von kaiwerner Beitrag anzeigen
          Wo ich aber noch auf dem Schlauch sehe ist, warum nur alle 60 Sekunden ein neuer Worker erzeugt wird wenn er nötig ist.
          Zitat von kaiwerner Beitrag anzeigen
          Wo ich aber noch auf dem Schlauch sehe ist, warum nur alle 60 Sekunden ein neuer Worker erzeugt wird wenn er nötig ist.
          Zwei Antworten:
          1. Weil das in smarthome.py ursprünglich mal so definiert wurde
          2. Damit nicht eine hohe Zahl an Tasks die Anzahl der Worker-Threads instant ins unermessliche treibt. (Das Erzeugen eines Threads ist im Verhältnis ein sehr großer Rechen-/Resoucen Aufwand) und: Threads werden nicht wieder abgebaut, weil das nochmal ein hoher Aufwand wäre, und im Zweifelsfall dann doch wieder ein neuer Thread erzeugt werden müsste.

            Wenn Du gesetzt den (übertriebenen) Fall hättest, dass zur gleichen Zeit 1.000 Scheduler Tasks starten sollen die jeweils 1 bis 2 Millisekunden rechnen, würdest Du sonst 1.000 Threads erzeugen, und das obwohl die sequenzielle Abarbeitung der nur 1 bis 2 Sekunden benötigt. So lange würde das übrigens auch dauern wenn Du 1000 Worker-Threads hättest, da Python nur einen Core der CPU nutzt. Da käme sogar noch die Rechenzeit zur Erzeugung der 1000 Threads dazu. Außerdem würdest Du dann aufgrund des GIL (Global Interpreter Lock) von Python die Abarbeitung zum erliegen bringen, wenn Du nicht eine sehr schnelle CPU hast.

          Nachtrag: Threads sollen eine quasi-Parallelisierung ermöglichen. Das macht bei sehr kurz laufenden Tasks nur sehr begrenzt sinn, da dann der Verwaltungsoverhead einen großen Teil der quasi-Parallelisierung wieder auffrisst (oder sogar überkompensiert).
          Zuletzt geändert von Msinn; 23.06.2020, 15:10. Grund: Nachtrag
          Viele Grüße
          Martin

          There is no cloud. It's only someone else's computer.

          Kommentar


            #35
            Danke für die ausführliche Erklärung .

            Das Verhalten sieht im Moment halt so aus:

            Threads.JPG
            Es könnten doch die ersten 20-30 Therads erzeugt werden, wenn sie benötigt werden. Alles was da über geht wird begrenzt.

            Aber klar es läuft bei vielen auf dünnerer Hardware und
            Zitat von Msinn Beitrag anzeigen
            Weil das in smarthome.py ursprünglich mal so definiert wurde
            ist auch ein Punkt.

            Danke nochmal!

            Kommentar


              #36
              Woher soll SmartHomeNG wissen, dass bei Dir über 20 Threads gebraucht werden? Bei mir sind nach der Initialisierung nur 6 Worker-Threads aktiv und die Zahl steigt innerhalb der ersten 3-4 Tage auf das dann konstante Maxium von 11.

              Du siehst in dem Graphen auch, dass Du bei vollständiger Entzerrung der Laufzeiten nur um die 5 Worker Threads bräuchtest.
              Viele Grüße
              Martin

              There is no cloud. It's only someone else's computer.

              Kommentar


                #37
                Du könntest auch noch statt eine Logik zu erstellen, mit den Item Attributen on_update bzw. oh_change arbeiten und Threads sparen.

                Du könntest ein Hilfsitem erzeugen, welches rechnet. Etwa so:

                Code:
                hilfsitem:
                    contab: ...
                    on_change:
                      - <item1>=<eval Ausdruck>
                      - <item2>=<eval Ausdruck>
                      - <item3>=<eval Ausdruck>
                Damit würde nur ein Task für das hilfsitem erzeugt und per on_change würden die berechneten Werte in den ganzen anderen Items geschrieben.

                Viele Grüße
                Martin

                There is no cloud. It's only someone else's computer.

                Kommentar


                  #38
                  Ich habe mir in den Scheduler ein logging Ausgabe eingebaut, die mir sagt wie viele Aufgaben in der Queue sind, wenn diese größer der Anzahl der Worker ist.

                  Code:
                  2020-06-24 09:00:00 INFO lib.scheduler Needing more worker threads 8! (Queue size: 70)
                  2020-06-24 09:00:00 INFO lib.scheduler Needing more worker threads 8! (Queue size: 70)
                  2020-06-24 09:00:00 INFO lib.scheduler Adding worker thread. Total: 9
                  2020-06-24 09:00:00 INFO lib.scheduler Adding worker thread. Total: 9
                  2020-06-24 09:00:01 INFO lib.scheduler Needing more worker threads 9! (Queue size: 70)
                  2020-06-24 09:00:01 INFO lib.scheduler Needing more worker threads 9! (Queue size: 70)
                  2020-06-24 09:00:01 INFO lib.scheduler Needing more worker threads 9! (Queue size: 68)
                  2020-06-24 09:00:01 INFO lib.scheduler Needing more worker threads 9! (Queue size: 68)
                  2020-06-24 09:00:02 INFO lib.scheduler Needing more worker threads 9! (Queue size: 68)
                  2020-06-24 09:00:02 INFO lib.scheduler Needing more worker threads 9! (Queue size: 68)
                  2020-06-24 09:00:02 INFO lib.scheduler Needing more worker threads 9! (Queue size: 64)
                  2020-06-24 09:00:02 INFO lib.scheduler Needing more worker threads 9! (Queue size: 64)
                  2020-06-24 09:00:03 INFO lib.scheduler Needing more worker threads 9! (Queue size: 63)
                  2020-06-24 09:00:03 INFO lib.scheduler Needing more worker threads 9! (Queue size: 63)
                  2020-06-24 09:00:03 INFO lib.scheduler Needing more worker threads 9! (Queue size: 59)
                  2020-06-24 09:00:03 INFO lib.scheduler Needing more worker threads 9! (Queue size: 59)
                  2020-06-24 09:00:04 INFO lib.scheduler Needing more worker threads 9! (Queue size: 57)
                  2020-06-24 09:00:04 INFO lib.scheduler Needing more worker threads 9! (Queue size: 57)
                  2020-06-24 09:00:04 INFO lib.scheduler Needing more worker threads 9! (Queue size: 54)
                  2020-06-24 09:00:04 INFO lib.scheduler Needing more worker threads 9! (Queue size: 54)
                  2020-06-24 09:00:05 INFO lib.scheduler Needing more worker threads 9! (Queue size: 53)
                  2020-06-24 09:00:05 INFO lib.scheduler Needing more worker threads 9! (Queue size: 53)
                  2020-06-24 09:00:05 INFO lib.scheduler Needing more worker threads 9! (Queue size: 53)
                  2020-06-24 09:00:05 INFO lib.scheduler Needing more worker threads 9! (Queue size: 53)
                  2020-06-24 09:00:06 INFO lib.scheduler Needing more worker threads 9! (Queue size: 52)
                  2020-06-24 09:00:06 INFO lib.scheduler Needing more worker threads 9! (Queue size: 52)
                  2020-06-24 09:00:06 INFO lib.scheduler Needing more worker threads 9! (Queue size: 50)
                  2020-06-24 09:00:06 INFO lib.scheduler Needing more worker threads 9! (Queue size: 50)
                  2020-06-24 09:00:07 INFO lib.scheduler Needing more worker threads 9! (Queue size: 50)
                  2020-06-24 09:00:07 INFO lib.scheduler Needing more worker threads 9! (Queue size: 50)
                  2020-06-24 09:00:07 INFO lib.scheduler Needing more worker threads 9! (Queue size: 48)
                  2020-06-24 09:00:07 INFO lib.scheduler Needing more worker threads 9! (Queue size: 48)
                  2020-06-24 09:00:08 INFO lib.scheduler Needing more worker threads 9! (Queue size: 47)
                  2020-06-24 09:00:08 INFO lib.scheduler Needing more worker threads 9! (Queue size: 47)
                  2020-06-24 09:00:08 INFO lib.scheduler Needing more worker threads 9! (Queue size: 44)
                  2020-06-24 09:00:08 INFO lib.scheduler Needing more worker threads 9! (Queue size: 44)
                  2020-06-24 09:00:09 INFO lib.scheduler Needing more worker threads 9! (Queue size: 43)
                  2020-06-24 09:00:09 INFO lib.scheduler Needing more worker threads 9! (Queue size: 43)
                  2020-06-24 09:00:09 INFO lib.scheduler Needing more worker threads 9! (Queue size: 40)
                  2020-06-24 09:00:09 INFO lib.scheduler Needing more worker threads 9! (Queue size: 40)
                  2020-06-24 09:00:10 INFO lib.scheduler Needing more worker threads 9! (Queue size: 38)
                  2020-06-24 09:00:10 INFO lib.scheduler Needing more worker threads 9! (Queue size: 38)
                  2020-06-24 09:00:10 INFO lib.scheduler Needing more worker threads 9! (Queue size: 36)
                  2020-06-24 09:00:10 INFO lib.scheduler Needing more worker threads 9! (Queue size: 36)
                  2020-06-24 09:00:11 INFO lib.scheduler Needing more worker threads 9! (Queue size: 33)
                  2020-06-24 09:00:11 INFO lib.scheduler Needing more worker threads 9! (Queue size: 33)
                  2020-06-24 09:00:11 INFO lib.scheduler Needing more worker threads 9! (Queue size: 33)
                  2020-06-24 09:00:11 INFO lib.scheduler Needing more worker threads 9! (Queue size: 33)
                  2020-06-24 09:00:12 INFO lib.scheduler Needing more worker threads 9! (Queue size: 28)
                  2020-06-24 09:00:12 INFO lib.scheduler Needing more worker threads 9! (Queue size: 28)
                  2020-06-24 09:00:12 INFO lib.scheduler Needing more worker threads 9! (Queue size: 27)
                  2020-06-24 09:00:12 INFO lib.scheduler Needing more worker threads 9! (Queue size: 27)
                  2020-06-24 09:00:13 INFO lib.scheduler Needing more worker threads 9! (Queue size: 22)
                  2020-06-24 09:00:13 INFO lib.scheduler Needing more worker threads 9! (Queue size: 22)
                  2020-06-24 09:00:13 INFO lib.scheduler Needing more worker threads 9! (Queue size: 22)
                  2020-06-24 09:00:13 INFO lib.scheduler Needing more worker threads 9! (Queue size: 22)
                  2020-06-24 09:00:14 INFO lib.scheduler Needing more worker threads 9! (Queue size: 15)
                  2020-06-24 09:00:14 INFO lib.scheduler Needing more worker threads 9! (Queue size: 15)
                  2020-06-24 09:00:14 INFO lib.scheduler Needing more worker threads 9! (Queue size: 15)
                  2020-06-24 09:00:14 INFO lib.scheduler Needing more worker threads 9! (Queue size: 15)
                  2020-06-24 10:00:00 INFO lib.scheduler Needing more worker threads 9! (Queue size: 67)
                  2020-06-24 10:00:00 INFO lib.scheduler Needing more worker threads 9! (Queue size: 67)
                  2020-06-24 10:00:00 INFO lib.scheduler Adding worker thread. Total: 10
                  2020-06-24 10:00:00 INFO lib.scheduler Adding worker thread. Total: 10
                  2020-06-24 10:00:01 INFO lib.scheduler Needing more worker threads 10! (Queue size: 67)
                  2020-06-24 10:00:01 INFO lib.scheduler Needing more worker threads 10! (Queue size: 67)
                  2020-06-24 10:00:02 INFO lib.scheduler Needing more worker threads 10! (Queue size: 62)
                  2020-06-24 10:00:02 INFO lib.scheduler Needing more worker threads 10! (Queue size: 62)
                  2020-06-24 10:00:02 INFO lib.scheduler Needing more worker threads 10! (Queue size: 61)
                  2020-06-24 10:00:02 INFO lib.scheduler Needing more worker threads 10! (Queue size: 61)
                  2020-06-24 10:00:03 INFO lib.scheduler Needing more worker threads 10! (Queue size: 55)
                  2020-06-24 10:00:03 INFO lib.scheduler Needing more worker threads 10! (Queue size: 55)
                  2020-06-24 10:00:03 INFO lib.scheduler Needing more worker threads 10! (Queue size: 54)
                  2020-06-24 10:00:03 INFO lib.scheduler Needing more worker threads 10! (Queue size: 54)
                  2020-06-24 10:00:04 INFO lib.scheduler Needing more worker threads 10! (Queue size: 48)
                  2020-06-24 10:00:04 INFO lib.scheduler Needing more worker threads 10! (Queue size: 48)
                  2020-06-24 10:00:04 INFO lib.scheduler Needing more worker threads 10! (Queue size: 46)
                  2020-06-24 10:00:04 INFO lib.scheduler Needing more worker threads 10! (Queue size: 46)
                  2020-06-24 10:00:05 INFO lib.scheduler Needing more worker threads 10! (Queue size: 40)
                  2020-06-24 10:00:05 INFO lib.scheduler Needing more worker threads 10! (Queue size: 40)
                  2020-06-24 10:00:05 INFO lib.scheduler Needing more worker threads 10! (Queue size: 40)
                  2020-06-24 10:00:05 INFO lib.scheduler Needing more worker threads 10! (Queue size: 40)
                  2020-06-24 10:00:06 INFO lib.scheduler Needing more worker threads 10! (Queue size: 34)
                  2020-06-24 10:00:06 INFO lib.scheduler Needing more worker threads 10! (Queue size: 34)
                  2020-06-24 10:00:06 INFO lib.scheduler Needing more worker threads 10! (Queue size: 33)
                  2020-06-24 10:00:06 INFO lib.scheduler Needing more worker threads 10! (Queue size: 33)
                  2020-06-24 10:00:07 INFO lib.scheduler Needing more worker threads 10! (Queue size: 27)
                  2020-06-24 10:00:07 INFO lib.scheduler Needing more worker threads 10! (Queue size: 27)
                  2020-06-24 10:00:07 INFO lib.scheduler Needing more worker threads 10! (Queue size: 25)
                  2020-06-24 10:00:07 INFO lib.scheduler Needing more worker threads 10! (Queue size: 25)
                  2020-06-24 10:00:08 INFO lib.scheduler Needing more worker threads 10! (Queue size: 19)
                  2020-06-24 10:00:08 INFO lib.scheduler Needing more worker threads 10! (Queue size: 19)
                  2020-06-24 10:00:08 INFO lib.scheduler Needing more worker threads 10! (Queue size: 17)
                  2020-06-24 10:00:08 INFO lib.scheduler Needing more worker threads 10! (Queue size: 17)
                  2020-06-24 10:00:09 INFO lib.scheduler Needing more worker threads 10! (Queue size: 11)
                  2020-06-24 10:00:09 INFO lib.scheduler Needing more worker threads 10! (Queue size: 11)
                  Damit erklärt sich der Anstieg der Worker zum Stundenwechsel bis auf die besagten 70 Stück.

                  Ich hab erstmal die restart_on_num_workers hoch gesetzt. Da werde ich wohl doch mal was umbauen müssen. Hätte nicht gedacht das die DB-Aufgaben so lange brauchen. Läuft ja bis zu 15 Sekunden.

                  Danke für die Unterstützung!

                  Kommentar


                    #39
                    Das hängt stark von der Anzahl History Werte und der Größe der Datenbank ab. Das könntest Du mit SmartHomeNG v1.7.2 evtl. entschärfen.
                    Falls Du die Detaildaten nicht mehr benötigst, z.B. weil Du sie in Summen-Items zusammengerechnet hast, kannst Du sie Löschen lassen.

                    Du kannst für solche Items das neue Attribut database_maxage (Anzahl Tage) setzen. Dann werden automatisch History Werte die älter sind gelöscht.

                    Bitte beachten. Wenn Du bei einem solchen Item sehr viele History Werte hast, kann das database Plugin beim 1. Start nach dem setzen des Attributes viel Zeit/Rechenleistung benötigen um die große Menge alter Daten zu löschen. Im späteren Verlauf werden die raus-alternden Daten regelmäßig gelöscht, so dass das dann von der Zeit/Rechenleistung her unauffällig ist.
                    Viele Grüße
                    Martin

                    There is no cloud. It's only someone else's computer.

                    Kommentar


                      #40
                      Das habe ich schon gesehen. Cooles Feature!

                      Die Größe der Datenbank.... naja...
                      Datengrab.JPG


                      Läuft sonst aber sehr gut.

                      Wenn das Testsystem diese Woche Durchhält, werde ich mal auf v1.7.2 umsteigen!
                      Tolle arbeit von euch.

                      Kommentar

                      Lädt...
                      X