🫗 Speichernutzung mit "Memory::Usage" auslesen, Speicherleck, Speicherverbrauch

Begonnen von Torxgewinde, 20 Oktober 2023, 15:35:30

Vorheriges Thema - Nächstes Thema

Torxgewinde

Inspiriert von https://perlmaven.com/how-much-memory-does-the-perl-application-use hier ein Device um den Speicherverbrauch von FHEM detailiert auszulesen. Dies ist hilfreich, wenn man herausfinden will ob man ein Speicherleck hat oder nicht.

defmod memUsageDevice dummy
attr memUsageDevice readingList wert
attr memUsageDevice setList wert
attr memUsageDevice userReadings check:wert:\scheck$ {\
    use Memory::Usage;;\
    my $result = "initialized...";;\
    \
    # Read result and keep it\
    if (defined($hash->{helper}{mu})) {\
        $hash->{helper}{mu}->record();;\
        my $state_ref = $hash->{helper}{mu}->state;;\
        \
        if (scalar(@$state_ref) == 2) {\
            my ($timestamp1, $message1, $vsz1, $rss1, $shared1, $text1, $data_stack1) = @{$state_ref->[0]};;\
            my ($timestamp2, $message2, $vsz2, $rss2, $shared2, $text2, $data_stack2) = @{$state_ref->[1]};;\
            \
            my $timestamp_d = $timestamp2 - $timestamp1;; #time in seconds between records\
            my $vsz_d = $vsz2 - $vsz1;; #virtual memory size\
            my $rss_d = $rss2 - $rss1;; #resident set size\
            my $shared_d = $shared2 - $shared1;; #shared memory size\
            my $text_d = $text2 - $text1;; #text (aka code or exe) size\
            my $data_stack_d = $data_stack2 - $data_stack1;; #data and stack size\
            \
            $result  = sprintf("Total: Timestamp: %12d, VSZ: %8d, RSS: %8d, Shared: %8d, Text: %6d, Data_Stack: %8d\n",\
                               $timestamp2, $vsz2, $rss2, $shared2, $text2, $data_stack2);;\
            $result .= sprintf("Diffs: Timestamp: %12d, VSZ: %8d, RSS: %8d, Shared: %8d, Text: %6d, Data_Stack: %8d",\
                               $timestamp_d, $vsz_d, $rss_d, $shared_d, $text_d, $data_stack_d);;\
            \
            readingsBulkUpdate($hash, "timestamp", $timestamp2);;\
            readingsBulkUpdate($hash, "VSZ", $vsz2);;\
            readingsBulkUpdate($hash, "RSS", $rss2);;\
            readingsBulkUpdate($hash, "Shared", $shared2);;\
            readingsBulkUpdate($hash, "Text", $text2);;\
            readingsBulkUpdate($hash, "Data_Stack", $data_stack2);;\
            \
            readingsBulkUpdate($hash, "timestamp_diff", $timestamp_d);;\
            readingsBulkUpdate($hash, "VSZ_diff", $vsz_d);;\
            readingsBulkUpdate($hash, "RSS_diff", $rss_d);;\
            readingsBulkUpdate($hash, "Shared_diff", $shared_d);;\
            readingsBulkUpdate($hash, "Text_diff", $text_d);;\
            readingsBulkUpdate($hash, "Data_Stack_diff", $data_stack_d);;\
        }\
    }\
    \
    #initiate profiling (again)\
    $hash->{helper}{mu} = Memory::Usage->new();;\
    $hash->{helper}{mu}->record();;\
    \
    return $result;;\
}
attr memUsageDevice webCmd wert check

Falls das Module nicht vorhanden ist, einfach unter Debian mit "apt install libmemory-usage-perl" installieren.

Der Output landet im Reading "check" und jeweils in eigenen Readings:
Total: Timestamp:   1697808561, VSZ:   194496, RSS:   151932, Shared:    14448, Text:   1620, Data_Stack:   137112
Diffs: Timestamp:            9, VSZ:        0, RSS:        0, Shared:        0, Text:      0, Data_Stack:        0

stobor

Ergänze ich den Code in der fhem.cfg, erkenne ich keinen Mehrwert.

Wie komme ich denn an den beschriebenen Output?
Intel NUC (Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-113-generic x86_64))  mit CUL V3.2 (Firmware 1.57 CUL868) für FS20 und CUL V3.4 (Firmware 1.57 CUL868) für HM + Arduino Mega
FHEM Revision: 29003
FS20-Schalter und Dimmer
HM Fensterkontakte, Heizungsthermostate, Temperatursensoren

mumpitzstuff

In der Fhem.cfg fummelt man nicht direkt rum!

Öffne ein Device und geh ganz unten neben help for ... auf die drei Punkte und wähle RAW Definition aus. Lösch dort alles und trag den Code von hier ein und führe ihn aus. Danach ist das Device angelegt. Jetzt musst du das Perl Modul außerhalb vom Fhem im Terminal installieren: apt install libmemory-usage-per

Danach kannst du das Device öffnen und ganz oben auf wert Check klicken. Das dann 2x mal machen und dazwischen 5min warten und es wird dir ein Reading erzeugt.

stobor

Aha, es scheint etwas zu kommen:
check
Total: Timestamp:   1728981773, VSZ:   216480, RSS:   208852, Shared:    12128, Text:   1668, Data_Stack:   196456
Diffs: Timestamp:            1, VSZ:        0, RSS:        0, Shared:        0, Text:      0, Data_Stack:        0
2024-10-15 10:42:53
check
Total: Timestamp:   1728982119, VSZ:   216480, RSS:   208852, Shared:    12128, Text:   1668, Data_Stack:   196456
Diffs: Timestamp:          346, VSZ:        0, RSS:        0, Shared:        0, Text:      0, Data_Stack:        0
2024-10-15 10:48:39
Intel NUC (Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-113-generic x86_64))  mit CUL V3.2 (Firmware 1.57 CUL868) für FS20 und CUL V3.4 (Firmware 1.57 CUL868) für HM + Arduino Mega
FHEM Revision: 29003
FS20-Schalter und Dimmer
HM Fensterkontakte, Heizungsthermostate, Temperatursensoren