Ankündigung

Einklappen
Keine Ankündigung bisher.

Performance und Zykluszeit

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

    Performance und Zykluszeit

    Hallo,

    da ich einen sehr hohen "load average" habe und mit der Firmware V3 zusätzlich längere Busantwortszeiten hinzugekommen sind, habe ich mich damit beschäftigt, wo der Performancefresser in meinem Programm herkommt.
    Um die Zykluszeit zu berechnen habe ich den Code aus dem Handbuch verwendet. Habe ich das richtig verstanden, dass Restzeit jede ms dekrementiert wird?
    Code:
    // Die erste Zyklus kann etwas länger dauern ...
    if afterc(after(systemstart(),30000u64), Max, Restzeit) then {
        StoppZeit=0u64;
        } endif
    if change (Restzeit) then {
        MaxZyklusZeit = max(StoppZeit - Restzeit - PerformanceZeit,MaxZyklusZeit);
        MinZyklusZeit = min(StoppZeit - Restzeit - PerformanceZeit,MinZyklusZeit);
        ZyklusZeit = (StoppZeit - Restzeit - PerformanceZeit);
        StoppZeit = Restzeit;
        } endif
    Wenn die Zykluszeit einen bestimmten Wert überschritten hat, sende ich auf den Bus.
    Code:
    if change(ZyklusZeit) and ((ZyklusZeit > 150u64) and (ZyklusZeit < 200u64))then write("150ms-11/0/0",EIN) endif
    if change(ZyklusZeit) and ((ZyklusZeit > 200u64) and (ZyklusZeit < 250u64))then write("200ms-11/0/5",EIN) endif
    Ich habe mit einem "leeren" Programm begonnen und nach und nach Funktionen hinzugefügt, um dem Performancefresser auf die Spur zu kommen. Dabei ist mir aufgefallen, dass es immer genau nach 5min, synchron zur aktuellen Uhrzeit, zu recht hochen Peaks in der Zykluszeit kommt, z.B. 16:05 Uhr, 16:10 Uhr, 16:15 Uhr, 16:20 Uhr usw.
    Mir ist nicht klar, wo diese Peaks herkommen. Ich habe in meinem Programm nichts, was alle 5 min irgendetwas bestimmtes ausführt.
    Gibt es in der Firmware vielleicht irgendetwas mit dieser Zeitbasis?

    Gruß Markus

    #2
    Zitat von Marha Beitrag anzeigen
    Gibt es in der Firmware vielleicht irgendetwas mit dieser Zeitbasis?
    azimuth und evlavation. Wobei die 200ms noch nicht wirklich schlimm sind, va. wenn das nur alle 5 Minuten auftritt. Der EibPC puffert ja in Echzeit (1ms) die Daten der Schnittstellen, TCP etc. Zudem benötigt ja ein KNX Telegramm schon in der Größenordnung von einigen zig ms.
    offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
    Enertex Produkte kaufen

    Kommentar


      #3
      Das erklärt schonmal die 5 min. Danke.
      200 ms sind es nur im Moment, da ich nur einen geringen Teil der Funktionen eingebunden habe. Mit allen Funktionen im Code sind es in den Peaks immer über 950 ms.
      Manchmal kommt es aber auch bei der Berechnung der Zykluszeit zu einer Zyklusszeit von 18446744073709551611. Ich vermute mal, das ist irgendwie ein Überlauf bei der Berechnung. Wie passiert das?

      Wobei die 200ms noch nicht wirklich schlimm sind, va. wenn das nur alle 5 Minuten auftritt.
      Welche Zykluszeit (dauerhaft) wird denn so langsam schlimm?
      Bisher treten die Peaks nur alle 5min auf, sind also vernachlässigbar.

      Gruß Markus

      Kommentar


        #4
        Zitat von Marha Beitrag anzeigen
        Welche Zykluszeit (dauerhaft) wird denn so langsam schlimm?
        alles was über 900ms wird, ist eher problematisch.
        offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
        Enertex Produkte kaufen

        Kommentar


          #5
          alles was über 900ms wird, ist eher problematisch
          Ok, das ist dann schonmal ein Richtwert, den ich habe. Vermutlich hängt die verzögerte Busantwortszeit damit zusammen.

          Kannst Du Dir auf Anhieb erklären, wie es zu dem Überlauf bei der Berechnung der Zykluszeit kommen kann?

          Gruß Markus

          Kommentar


            #6
            Zitat von Marha Beitrag anzeigen
            Kannst Du Dir auf Anhieb erklären, wie es zu dem Überlauf bei der Berechnung der Zykluszeit kommen kann?
            hm.... vermutlich ein Rundungsfehler beim Performancezeit. Die ist ja intern in µs-tics und da könnte mal eine Pause 0.9ms länger dauern, als angegeben und die Verarbeitung nur 0.1ms und schon ist der Überlauf da. Mach mal -1 bei der Performancezeit, ohne das im EibStudio anzusetzen - nicht dass dich der EibPC wieder überholt.
            offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
            Enertex Produkte kaufen

            Kommentar


              #7
              Ok, Danke

              Gruß Markus

              Kommentar


                #8
                Habe nun eine Durchlaufzeit von dauerhaft 300 ms erreicht bei einer Speicherauslastung von 23,8 % (Hälfte ist erreicht). Der load average ist in allen drei Bereichen bei ca. 1,1. Allerdings ist noch keine TCP-Kommunikation und keine UDP Kommunikation eingebunden.
                Wird diese Durchlaufzeit langsam kritisch?
                Was bedeuten denn die drei Zahlen bei der load average?
                Sagen diese Zahlen etwas darüber aus, in welchem Bereich der EibPC besonders viel zu tun hat, bzw. wo man noch im Code optimieren sollte?

                Kommentar


                  #9
                  Zitat von Marha Beitrag anzeigen
                  Habe nun eine Durchlaufzeit von dauerhaft 300 ms erreicht bei einer Speicherauslastung von 23,8 % (Hälfte ist erreicht). Der load average ist in allen drei Bereichen bei ca. 1,1. Allerdings ist noch keine TCP-Kommunikation und keine UDP Kommunikation eingebunden.
                  Wird diese Durchlaufzeit langsam kritisch?
                  Nein, 300ms ist noch unkritisch. 900ms ist wirklich kritisch.
                  Was bedeuten denn die drei Zahlen bei der load average?
                  Das ist der Nice-Wert, siehe Load ? Wikipedia.
                  Sagen diese Zahlen etwas darüber aus, in welchem Bereich der EibPC besonders viel zu tun hat, bzw. wo man noch im Code optimieren sollte?
                  Jein, siehe Artikel. Weil der Wert an sich noch nicht alles aussagt, hatten wir den erst nicht drin, aber die Anwender halt ....
                  Etwas Berechtigung hat der schon, steht da was dauerhaft von 5, dann ist das zumindest ungewöhnlich.
                  offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                  Enertex Produkte kaufen

                  Kommentar


                    #10
                    Ich sehe meinen Fehler nicht!

                    Hallo,

                    entsprechend dem Beispiel von Marha wolte ich auch meine Performancezeiten überprüfen. Das ging auch schon einmal.

                    Ich habe für das bessere Debug allen Feldern ein EIB.. zuvorgesetzt. Jetzt ligen die Felder hintereinander und sind somit besser im Debuger zu verfolgen. Um die Tracefunktion nur bei Bedarf einzuschalten, habe ich nich die Variable EIBvarZeitZykl=AUS eingefügt die ich bei Bedarf auf EIN setze.

                    Wie in den beiden Bildern zu sehen ist, ändert sich die Restzeit. Der change(Restzeit) sollte wirken, jedoch die Befehle danach werden nicht erkannt.

                    Ging aber vor 2 Wochen schon mal. Habe ich einen Fehler hineingebracht?

                    Wer sieht bitte meinen Fehler und kann mir helfen?

                    Meine Stimmung entspricht dem Wetter.

                    Wolfgang

                    //
                    HTML-Code:
                    // Im EibStudio ggf. geändert, Defaultwert ist 20ms
                    EIBPerformanceZeit=20u64
                    EIBvarZeitZykl=AUS    
                    EIBMax=1000000000000000u64
                    EIBRestzeit=0u64
                    EIBZyklusZeit=0u64
                    EIBStoppZeit=EIBMax
                    EIBMaxZyklusZeit=0u64
                    EIBMinZyklusZeit=EIBMax
                    // Die erste Zyklus kann etwas länger dauern ...
                    
                      if afterc(after(systemstart(),30000u64), EIBMax, EIBRestzeit) then {
                         EIBStoppZeit=0u64;
                       } endif
                    if EIBvarZeitZykl == EIN then {
                      if change (EIBRestzeit) then {
                        EIBMaxZyklusZeit = max(EIBStoppZeit - EIBRestzeit - EIBPerformanceZeit,EIBMaxZyklusZeit);
                        EIBMinZyklusZeit = min(EIBStoppZeit - EIBRestzeit - EIBPerformanceZeit,EIBMinZyklusZeit);
                        EIBStoppZeit = EIBRestzeit;
                        EIBZyklusZeit = (EIBStoppZeit - EIBRestzeit - EIBPerformanceZeit);
                     } endif;
                    } endif
                    if change(EIBZyklusZeit) then {
                           if ((EIBZyklusZeit > 150u64) and (EIBZyklusZeit < 200u64) and EIBvarZeitZykl == EIN)then write("150ms-11/0/0",EIN) endif;
                           if ((EIBZyklusZeit > 200u64) and (EIBZyklusZeit < 250u64)  and EIBvarZeitZykl == EIN)then write("200ms-11/0/1",EIN) endif;
                           if ((EIBZyklusZeit > 250u64)   and EIBvarZeitZykl == EIN)then write("Zykluszeit-11/0/2",convert(EIBZyklusZeit,0f16)) endif;
                    } endif
                    Angehängte Dateien

                    Kommentar


                      #11
                      Zitat von schloessl Beitrag anzeigen
                      ...habe ich nich die Variable EIBvarZeitZykl=AUS eingefügt die ich bei Bedarf auf EIN setze.
                      Der Code der Hauptebene reagiert nur auf Änderungen, d.h. die Bedingung für deine Freigabevariable wird nur bei Änderung auf EIN einmalig ausgeführt.

                      Du musst die Freigabevariable an die Bedingung der anderen Ifs anfügen und somit die if-verschachtelung entfernen:

                      [highlight=epc]
                      ...
                      if ( EIBvarZeitZykl == EIN ) and change (EIBRestzeit) then {
                      EIBMaxZyklusZeit = max(EIBStoppZeit - EIBRestzeit - EIBPerformanceZeit,EIBMaxZyklusZeit);
                      EIBMinZyklusZeit = min(EIBStoppZeit - EIBRestzeit - EIBPerformanceZeit,EIBMinZyklusZeit);
                      EIBStoppZeit = EIBRestzeit;
                      EIBZyklusZeit = (EIBStoppZeit - EIBRestzeit - EIBPerformanceZeit);
                      } endif
                      ...
                      [/Highlight]
                      BR
                      Marc

                      Kommentar


                        #12
                        Danke, das war es-

                        Zitat von saft6luck Beitrag anzeigen
                        Der Code der Hauptebene reagiert nur auf Änderungen, d.h. die Bedingung für deine Freigabevariable wird nur bei Änderung auf EIN einmalig ausgeführt.

                        Du musst die Freigabevariable an die Bedingung der anderen Ifs anfügen und somit die if-verschachtelung entfernen:
                        ...
                        [/highlight]
                        Hallo saft6lock,

                        wer lesen kann, hat mehr vom Leben. Einige Stunden hat mich die Fehlersuche gekostet.
                        Dabei stehts im Handbuch.

                        Aber machmal braucht man einen Tritt ......

                        Danke und frohe Ostern

                        Wolfgang

                        Kommentar

                        Lädt...
                        X