Ankündigung

Einklappen
Keine Ankündigung bisher.

Needing more worker threads than .. (scheinbar nicht durch Plugin)

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

    Needing more worker threads than .. (scheinbar nicht durch Plugin)

    Hallo,

    das Problem wurde an anderer Stelle schon zweimal angesprochen - da waren aber Plugins schuld.
    Hier könnte ich vielleicht schuld sein. Ich bekomme mehrfach im Log:

    Code:
    2020-09-09 02:05:09 ERROR scheduler lib.scheduler Needing more worker threads than the specified maximum of 20! (30 worker threads active) -- scheduler.py:run:217
    2020-09-09 02:05:09 WARNING scheduler lib.scheduler Worker-Threads: Haustechnik.Stromverbrauch.Dali.Verbrauch.woche: 1, Haustechnik.Waschmaschine.Verbrauch.jahr: 1, Haustechnik.Stromverbrauch.Dali.Verbrauch.monat: 1, Haustechnik.Stromzaehler.Momentanleistung_1min_c: 4, Haustechnik.Lueftung.Verbrauch.monat: 1, Haustechnik.Robomow_Und_Staubsauger.Verbrauch.mona t: 1, Haustechnik.Serverschrank.Verbrauch.monat: 1, Haustechnik.Stromverbrauch.Dali.Verbrauch.heute: 1, Haustechnik.Lueftung.Verbrauch.heute: 1, Haustechnik.Stromzaehler.Leistungsdurchschnitt24h: 1, Haustechnik.Serverschrank.Verbrauch.jahr: 1, Haustechnik.Stromzaehler.Momentanleistung_10min_c: 3, Haustechnik.Lueftung.Verbrauch.woche: 1, Haustechnik.Stromzaehler.Momentanleistung_10min: 1, Haustechnik.Robomow_Und_Staubsauger.Verbrauch.heut e: 1, Haustechnik.Robomow_Und_Staubsauger.Verbrauch.woch e: 1, Haustechnik.Serverschrank.Verbrauch.heute: 1, Haustechnik.Waschmaschine.Verbrauch.heute: 1, Haustechnik.Serverschrank.Verbrauch.woche: 1, Haustechnik.Waschmaschine.Verbrauch.woche: 1, Haustechnik.Robomow_Und_Staubsauger.Verbrauch.jahr : 1, plugins.avdevice.avdevice-tcp-reconnect: 1, Haustechnik.Stromverbrauch.Dali.Verbrauch.jahr: 1, Haustechnik.Waschmaschine.Verbrauch.monat: 1, Haustechnik.Lueftung.Verbrauch.jahr: 1 -- scheduler.py:run:231

    Diese Items entstehen durch einen Struct:
    Code:
    Verbrauch:
    type: num
    cycle: 60 # wenn cycle erhöht wird auch * 60.0 erhöhen
    eval: self()+ self.return_parent().Leistung() * 60.0 / 60.0 / 60.0 / 1000
    database: 'init'
    influx: true
    Tagessumme:
    type: num
    database: 'init'
    eval: (sh.return_parent()-sh.return_parent().db('min', '24h'))
    crontab: '59 23 * * =1'
    visu: 'yes'
    influx: true
    enforce_updates: true
    Wochensumme:
    type: num
    database: 'init'
    eval: (sh.return_parent()-sh.return_parent().db('min', '168h'))
    crontab: '59 23 * 0 =1'
    visu: 'yes'
    influx: true
    enforce_updates: true
    heute:
    type: num
    visu_acl: ro
    eval: round((sh...() - sh...db('max', str(shtime.time_since(shtime.today(), 'im')) + 'i', str(shtime.time_since(shtime.today(), 'im')) + 'i')), 2)
    eval_trigger:
    - ..
    cache: yes
    
    woche:
    type: num
    visu_acl: ro
    eval: round((sh...() - sh...db('max', str(shtime.time_since(shtime.beginning_of_week(), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(), 'im')) + 'i')), 2)
    eval_trigger:
    - ..
    cache: yes
    
    monat:
    type: num
    visu_acl: ro
    eval: round((sh...() - sh...db('max', str(shtime.time_since(shtime.beginning_of_month(), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(), 'im')) + 'i')), 2)
    eval_trigger:
    - ..
    cache: yes
    
    jahr:
    type: num
    visu_acl: ro
    eval: round((sh...() - sh...db('max', str(shtime.time_since(shtime.beginning_of_year(), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_year(), 'im')) + 'i')), 2)
    eval_trigger:
    - ..
    cache: yes
    
    gestern:
    type: num
    visu_acl: ro
    eval: round((sh...db('max', str(shtime.time_since(shtime.today(), 'im')) + 'i', str(shtime.time_since(shtime.today(), 'im')) + 'i') - sh...db('max', str(shtime.time_since(shtime.yesterday(), 'im')) + 'i', str(shtime.time_since(shtime.yesterday(), 'im')) + 'i')), 2)
    crontab:
    - 1 0 * * = 1
    - init+20 = 1
    database: init
    
    gestern_minus1:
    type: num
    visu_acl: ro
    eval: round((sh...db('max', str(shtime.time_since(shtime.yesterday(), 'im')) + 'i', str(shtime.time_since(shtime.yesterday(), 'im')) + 'i') - sh...db('max', str((shtime.time_since(shtime.yesterday(), 'im')) + 1440) + 'i', str((shtime.time_since(shtime.yesterday(), 'im')) + 1440) + 'i')), 2)
    crontab:
    - 1 0 * * = 1
    - init+20 = 1
    cache: yes
    
    gestern_minus2:
    type: num
    visu_acl: ro
    eval: round((sh...db('max', str((shtime.time_since(shtime.yesterday(), 'im')) + 1440) + 'i', str((shtime.time_since(shtime.yesterday(), 'im')) + 1440) + 'i') - sh...db('max', str((shtime.time_since(shtime.yesterday(), 'im')) + 2880) + 'i', str((shtime.time_since(shtime.yesterday(), 'im')) + 2880) + 'i')), 2)
    crontab:
    - 1 0 * * = 1
    - init+20 = 1
    cache: yes
    
    gestern_minus3:
    type: num
    visu_acl: ro
    eval: round((sh...db('max', str((shtime.time_since(shtime.yesterday(), 'im')) + 2880) + 'i', str((shtime.time_since(shtime.yesterday(), 'im')) + 2880) + 'i') - sh...db('max', str((shtime.time_since(shtime.yesterday(), 'im')) + 4320) + 'i', str((shtime.time_since(shtime.yesterday(), 'im')) + 4320) + 'i')), 2)
    crontab:
    - 1 0 * * = 1
    - init+20 = 1
    cache: yes
    
    gestern_minus4:
    type: num
    visu_acl: ro
    eval: round((sh...db('max', str((shtime.time_since(shtime.yesterday(), 'im')) + 4320) + 'i', str((shtime.time_since(shtime.yesterday(), 'im')) + 4320) + 'i') - sh...db('max', str((shtime.time_since(shtime.yesterday(), 'im')) + 5760) + 'i', str((shtime.time_since(shtime.yesterday(), 'im')) + 5760) + 'i')), 2)
    crontab:
    - 1 0 * * = 1
    - init+20 = 1
    cache: yes
    
    gestern_minus5:
    type: num
    visu_acl: ro
    eval: round((sh...db('max', str((shtime.time_since(shtime.yesterday(), 'im')) + 5760) + 'i', str((shtime.time_since(shtime.yesterday(), 'im')) + 5760) + 'i') - sh...db('max', str((shtime.time_since(shtime.yesterday(), 'im')) + 7200) + 'i', str((shtime.time_since(shtime.yesterday(), 'im')) + 7200) + 'i')), 2)
    crontab:
    - 1 0 * * = 1
    - init+20 = 1
    cache: yes
    
    vorwoche:
    type: num
    visu_acl: ro
    eval: round((sh...db('max', str(shtime.time_since(shtime.beginning_of_week(), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(), 'im')) + 'i') - sh...db('max', str(shtime.time_since(shtime.beginning_of_week(sht ime.calendar_week() - 1), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(sht ime.calendar_week() - 1), 'im')) + 'i')), 2)
    crontab:
    - 1 0 * * = 1
    - init+20 = 1
    database: init
    
    vorwoche_minus1:
    type: num
    visu_acl: ro
    eval: round((sh...db('max', str(shtime.time_since(shtime.beginning_of_week(sht ime.calendar_week() - 1), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(sht ime.calendar_week() - 1), 'im')) + 'i') - sh...db('max', str(shtime.time_since(shtime.beginning_of_week(sht ime.calendar_week() - 2), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(sht ime.calendar_week() - 2), 'im')) + 'i')), 2)
    crontab:
    - 1 0 * * = 1
    - init+20 = 1
    cache: yes
    
    vorwoche_minus2:
    type: num
    visu_acl: ro
    eval: round((sh...db('max', str(shtime.time_since(shtime.beginning_of_week(sht ime.calendar_week() - 2), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(sht ime.calendar_week() - 2), 'im')) + 'i') - sh...db('max', str(shtime.time_since(shtime.beginning_of_week(sht ime.calendar_week() - 3), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(sht ime.calendar_week() - 3), 'im')) + 'i')), 2)
    crontab:
    - 1 0 * * = 1
    - init+20 = 1
    cache: yes
    
    vorwoche_minus3:
    type: num
    visu_acl: ro
    eval: round((sh...db('max', str(shtime.time_since(shtime.beginning_of_week(sht ime.calendar_week() - 3), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(sht ime.calendar_week() - 3), 'im')) + 'i') - sh...db('max', str(shtime.time_since(shtime.beginning_of_week(sht ime.calendar_week() - 4), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(sht ime.calendar_week() - 4), 'im')) + 'i')), 2)
    crontab:
    - 1 0 * * = 1
    - init+20 = 1
    cache: yes
    
    vormonat:
    type: num
    visu_acl: ro
    eval: round((sh...db('max', str(shtime.time_since(shtime.beginning_of_week(sht ime.calendar_week() - 1), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(sht ime.calendar_week() - 1), 'im')) + 'i') - sh...db('max', str(shtime.time_since(shtime.beginning_of_month(sh time.current_month() - 2), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(sh time.current_month() - 2), 'im')) + 'i')), 2)
    crontab:
    - 1 0 1 * = 1
    - init+20 = 1
    database: init
    
    vormonat_minus1:
    type: num
    visu_acl: ro
    eval: round((sh...db('max', str(shtime.time_since(shtime.beginning_of_week(sht ime.calendar_week() - 1), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(sht ime.calendar_week() - 1), 'im')) + 'i') - sh...db('max', str(shtime.time_since(shtime.beginning_of_month(sh time.current_month() - 2), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(sh time.current_month() - 2), 'im')) + 'i')), 2)
    crontab:
    - 1 0 1 * = 1
    - init+20 = 1
    cache: yes
    
    vormonat_minus2:
    type: num
    visu_acl: ro
    eval: round((sh...db('max', str(shtime.time_since(shtime.beginning_of_week(sht ime.calendar_week() - 2), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_week(sht ime.calendar_week() - 2), 'im')) + 'i') - sh...db('max', str(shtime.time_since(shtime.beginning_of_month(sh time.current_month() - 3), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(sh time.current_month() - 3), 'im')) + 'i')), 2)
    crontab:
    - 1 0 1 * = 1
    - init+20 = 1
    cache: yes
    
    vormonat_zaehlerstand:
    type: num
    visu_acl: ro
    eval: round(sh...db('max', str(shtime.time_since(shtime.beginning_of_month(), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(), 'im')) + 'i'), 2)
    crontab:
    - 1 0 1 * = 1
    - init+20 = 1
    database: init
    
    vormonat_minus1_zaehlerstand:
    type: num
    visu_acl: ro
    eval: round(sh...db('max', str(shtime.time_since(shtime.beginning_of_month(sh time.current_month() - 1), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(sh time.current_month() - 1), 'im')) + 'i'), 2)
    crontab:
    - 1 0 1 * = 1
    - init+20 = 1
    cache: yes
    
    vormonat_minus2_zaehlerstand:
    type: num
    visu_acl: ro
    eval: round(sh...db('max', str(shtime.time_since(shtime.beginning_of_month(sh time.current_month() - 2), 'im')) + 'i', str(shtime.time_since(shtime.beginning_of_month(sh time.current_month() - 2), 'im')) + 'i'), 2)
    crontab:
    - 1 0 1 * = 1
    - init+20 = 1
    cache: yes
    Den ich hier aus dem Forum habe.

    Sehe ich es richtig, dass die Anzahl der Scheduler auf 20 begrenzt ist, und ich diesen Struct somit nicht/seltenst nutzen sollte? Gibt es eine Alternative?

    Gruß,
    Hendrik


    #2
    Nein, die Anzahl Scheduler-Threads ist nicht auf 20 begrenzt. Das wurde hier und auf Gitter auch schon mehrfach diskutiert.

    Bei zu vielen aktiven (nicht wartenden) Schedulern fräst sich der Scheduler irgendwann fest und shNG tut nichts mehr.

    20 ist eine Warnschwelle. Ab da wird jedes mal wenn der Scheduler einen neuen Thread generiert (weil kein idle Thread frei ist) eine Warnung geloggt. Eine ständig wiederkehrende Warnung zeigt an, dass irgendwo ständig neue Scheduler-Threads erzeugt werden, meistens weil die cycle Time des Schedulers geringer ist als die Ausführungszeit des Tasks.

    Ein neuer Scheduler Thread wird generiert, wenn über einen gewissen Zeitraum die Queue der Scheduler die laufen wollen nicht leer wird. Dein Beispiel wird auf jeden Fall eine (oder auch mehrere) Warnungen generieren, bis die Anzahl Scheduler Threads passt. Das liegt daran, dass beim Start alle durch die Items induzierten Scheduler gleichzeitig loslaufen wollen.

    Sinnvoll wäre es, da die crontabs gleich sind, nur einen crontab Scheduler zu erzeugen, entweder
    • durch ein/ein paar Items dass per on_update die ganzen evals ausführt und den jeweiligen Itmes zuweist
    oder
    • Die Berechnungen in einer oder wenigen Logik(en) durchzuführen, die über einen crontab Eintrag getriggert wird.
    Falls Du nur recht wenige Items wie von Dir oben beschrieben hast, kannst Du es auch lassen wie es ist.

    P.S.

    ​​​​​​​P.S.: Poste bitte in Zukunft formatierten Code!
    (siehe hier: https://knx-user-forum.de/forum/supp...htig-einfügen)
    Zuletzt geändert von Msinn; 09.09.2020, 07:27.
    Viele Grüße
    Martin

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

    Kommentar


      #3
      Hallo,

      vielen Dank für die ausführliche und klare Erklärung.

      Zitat von Msinn Beitrag anzeigen
      Sinnvoll wäre es, da die crontabs gleich sind, nur einen crontab Scheduler zu erzeugen, entweder
      • durch ein/ein paar Items dass per on_update die ganzen evals ausführt und den jeweiligen Itmes zuweist
      oder
      • Die Berechnungen in einer oder wenigen Logik(en) durchzuführen, die über einen crontab Eintrag getriggert wird.
      Falls Du nur recht wenige Items wie von Dir oben beschrieben hast, kannst Du es auch lassen wie es ist.
      Verstehe ich. Aber mir fällt kein Weg ein, wie ich die ersten Beiden Varianten mit Structs verbinden kann. Das wäre also viel Aufwand.

      Es sind aktuell acht Items.

      Zitat von Msinn Beitrag anzeigen
      P.S.: Poste bitte in Zukunft formatierten Code!
      (siehe hier: https://knx-user-forum.de/forum/supp...htig-einfügen)
      Arrgh. Sorry. Hab vergessen den Editor-Modus zu ändern.

      Gruß,
      ​​​​​​​HEndrik

      Kommentar

      Lädt...
      X