Optimierungsvorschlag "HandleTimeout()" in fhem.pl

Begonnen von noansi, 20 Dezember 2017, 21:54:02

Vorheriges Thema - Nächstes Thema

KernSani

Nur zur Info, im Anfängerforum gibt es auch einen Thread, in dem das gleiche Verhalten beobachtet wurde.


Kurz, weil mobil...
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

rudolfkoenig

@DS_Starter: verwendest du apptime? apptime ist z.Zt. nicht kompatibel mit der aktuellen fhem.pl, da es zwar die Routine von Auswerten des Timers (HandleTimeout) ueberschreibt, aber nicht die zum Hinzufuegen/Loeschen. Die Symptome entsprechen deinem Fall: @intAtA waechst monoton, da nie Eintraege geloescht werden, und irgendwann wird das Einfuegen eines Timers merkbar aufwendig.

Ich habe angenommen, dass durch paralleles Pflegen von %intAt eine apptime Anpassung nicht dringend ist, habe aber wohl nicht alles bedacht.

DS_Starter

#92
Guter Hinweis !

Ja, apptime ist noch an. Ich deaktiviere es mal und beobachte ....

Sieht schon anders aus:

{ @intAtA }              -> 117
{ int(keys %intAt) }  -> 116

und "{ join("\n", map {$intAtA[$_]->{FN}} grep { !$intAt{ $intAtA[$_]->{atNr} } } (0..@intAtA)) }" liefert nichts.

Ich melde mich wieder nach ein paar Stunden wie es dann aussieht.

LG,
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

DS_Starter

Hallo Rudi,

das wars !
Nun ist die Instanz etliche Stunden ohne den dargestellten CPU-Anstieg gelaufen.

apptime und perfmon waren bei bei mir Verursacher.

Danke für die Unterstützung !

LG,
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

der-Lolo

Hier klemmt FHEM auch durch apptime - gestern habe ich ein update gemacht...
Habe apptime ausgeschaltet und neu gestartet, das hilft erstmal.
Apptime auf pause stellen reicht nicht...

noansi

Hallo Zusammen,

im Anhang mal ein apptime, basierend auf Martins letzter Version, nach neuem Timer Handling, bis Martin aktualisiert hat.

Gruß, Ansgar.

DS_Starter

Hallo ansgar,

habe dein Modul auf meiner Testmaschine aktiviert.
Mal schauen wie es sich nach ein paar Stunden darstellt.

Grüße,
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

noansi

#97
Hallo KernSani,

hier mal ein (ungetesteter) Anpassungsvorschlag bezüglich @intATA für freezemon:

###################################
sub freezemon_apptime($) {
    my ($hash) = @_;
    my $name = $hash->{NAME};

    my $now          = gettimeofday();
    my $minCoverExec = 10;               # Let's see if we can find more if we look ahead further
    my $minCoverWait = 0.00;
    my $ret          = "";

    my ( $fn, $tim, $cv, $fnname, $arg, $shortarg );

    my $n = int(@intAtA); # @intAtA is sorted ascending by time
    my $i = -1;
    while(++$i < $n) {
        last if (($intAtA[$i]->{TRIGGERTIME} - $now) > $minCoverExec);

        $tim = $intAtA[$i]->{TRIGGERTIME};

        if ( $tim - gettimeofday() > $minCoverWait ) {

            #next;
        }

        $fn = $intAtA[$i]->{FN};

        if ( $fn eq "freezemon_ProcessTimer" ) {
            next;
        }

        if ( ref($fn) ne "" ) {
            $cv     = svref_2object($fn);
            $fnname = $cv->GV->NAME;
            $ret .= $tim . "-" . $fnname;
            Log3 $name, 5, "Freezemon: Reference found: " . ref($fn) . "/$fnname/$fn";
        }
        else {
            $ret .= $tim . "-" . $fn;
        }
        $arg = $intAtA[$i]->{ARG};

        $shortarg = ( defined($arg) ? $arg : "" );
        if ( ref($shortarg) eq "HASH" ) {
            if ( !defined( $shortarg->{NAME} ) ) {
                if ( AttrVal( $name, "fm_extDetail", 0 ) == 1 ) {
                    if ( $fn eq "BlockingKill" or $fn eq "BlockingStart") {
                        $shortarg = $shortarg->{abortArg}{NAME};
Log3 $name, 5, "Freezemon: found $fn " . Dumper($shortarg) ;
                    }
                    elsif ( $fn eq "HttpUtils_Err" ) {
                        $shortarg = $shortarg->{hash}{hash}{NAME};
                    }
                    else {
                        Log3 $name, 5, "Freezemon: found something without a name $fn" . Dumper($shortarg);
                        $shortarg = "N/A";
                    }
                }
                else {
                    $shortarg = "N/A";
                }
            }
            else {
                $shortarg = $shortarg->{NAME};
            }
        }
        elsif ( ref($shortarg) eq "REF" ) {
            if ( $fn eq "DOIF_TimerTrigger" ) {
                my $deref = ${$arg};  #seems like $arg is a reference to a scalar which in turm is a reference to a hash
                $shortarg = $deref->{'hash'}{NAME};    #at least in DOIF_TimerTrigger
            }
            else {
                Log3 $name, 5, "Freezemon: found a REF $fn " . Dumper( ${$arg} );
            }
        }
        else {
            #Log3 $name, 3, "Freezemon: found something that's not a HASH $fn ".ref($shortarg)." ".Dumper($shortarg);
            $shortarg = "N/A";
        }
        if ( !$shortarg ) {
            Log3 $name, 5, "Freezemon: something went wrong $fn " . Dumper($arg);
            $shortarg = "";
        }
        else {
            ( $shortarg, undef ) = split( /:|;/, $shortarg, 2 );
        }
        $ret .= ":" . $shortarg . " ";
    }
    if (%prioQueues) {

foreach my $prio (keys %prioQueues) {
foreach my $entry (@{$prioQueues{$prio}}) {
#Log3 $name, 5, "Freezemon: entry is ".Dumper($entry);
$cv     = svref_2object( $entry->{fn});
$fnname = $cv->GV->NAME;
$ret .= "prio-" . $fnname;

$shortarg = ( defined( $entry->{arg} ) ? $entry->{arg} : "" );
#Log3 $name, 5, "Freezemon: found a prioQueue arg ".ref($shortarg);
if ( ref($shortarg) eq "HASH" ) {
if ( !defined( $shortarg->{NAME} ) ) {
$shortarg = "N/A";
              }
else {
$shortarg = $shortarg->{NAME};
              }
          }
elsif ( ref($shortarg) eq "ARRAY" ) {
$shortarg = $entry->{arg};
}

( $shortarg, undef ) = split( /:|;/, $shortarg, 2 );
$ret .= ":" . $shortarg . " ";
#Log3 $name, 5, "Freezemon: found a prioQueue, returning $ret";
}
}
    }

    return $ret;
}


Gruß, Ansgar.

KernSani

Hi Ansgar,

vielen Dank :-) Werde ich mir mal im Detail ansehen und einbauen.

Grüße,

Oli
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

DS_Starter

Hallo Ansger,

so ganz scheint dass apptime noch nicht zu klappen, kann aber auch an freezemon liegen.
(Habe beides auf der Testinstanz aktiv , fm_forceApptime = 1)

Jetzt nach mehr als 24h:

{ @intAtA }              -> 109477
{ int(keys %intAt) }  -> 74

Und { join("\n", map {$intAtA[$_]->{FN}} grep { !$intAt{ $intAtA[$_]->{atNr} } } (0..@intAtA)) } zeigt (Ausschnitt):


freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
getsnapinfo
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
getsnapinfo
freezemon_ProcessTimer
freezemon_ProcessTimer
getsnapinfo
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
FW_closeInactiveClients
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
delcookiefile
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
getsnapinfo
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
freezemon_ProcessTimer
....
....


Der CPU-Load ist inzwischen auch wieder deutlich angestiegen.

Grüße,
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

noansi

Hallo Heiko,

bist Du sicher, dass Du das richtige apptime aus meinem Beitrag oben zum Test verwendest?
Nach Code kann ich es nicht nachvollziehen.

Gruß, Ansgar.

KernSani

Hi Heiko,

ich möchte es nicht ausschließen, dass Freezemon Schuld ist, logisch kann ich es mir aber nicht erklären (da Freezemon nur lesend auf %intA zugreift und - Stand heute - @intAtA noch garnicht berücksichtigt). Ich würde eher Rudis Theorie folgen, dass Freezemon/Perfmon aufgrund sekündlicher InternalTimers das ganze schneller hochschaukeln.
Habe jetzt aber endlich mal mein Testsystem upgedated um mir @intAtA anzusehen.

Übrigens: fm_forceApptime mach nichts anderes als fhem( "apptime") abzusetzen, wenn apptime nicht in den %cmds vorhanden ist...

Grüße,
Oli
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

DS_Starter

#102
Hallo Ansgar,

ja bin ich, gestern runtergeladen und ins Verzeichnis gestellt.
Ich habe jetzt mal in freezemon fm_forceApptime = 0 gesetzt, restartet und nun schaue ich nochmal.

Ist eben bisschen blöd dass soviel Zeit vergehen muss um etwas aussagekräftiges zu erhalten.

@Oli, ja fm_forceApptime ist klar.

EDIT: freezemon würde ich wahrscheinlich auch ausschließen. Hatte bisher (mit fm_forceApptime = 0) keinerlei negative Auswirkungen

Grüße,
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

herrmannj

Zitat von: KernSani am 26 Februar 2018, 22:36:18
Ich würde eher Rudis Theorie folgen, dass Freezemon/Perfmon aufgrund sekündlicher InternalTimers das ganze schneller hochschaukeln.
Für perfmon kann ich das nicht feststellen. Woher stammt die Aussage ? - bzw, to-dos ?

DS_Starter

Hallo Ansgar,

Kommando zurück ... ich  habe heute früh ein Update gemacht und das hat mir apptime natürlich wieder überklatscht.
Ich nehme alles zurück !  :o

LG,
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter