FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: Torxgewinde am 20 Oktober 2023, 15:35:30

Titel: 🫗 Speichernutzung mit "Memory::Usage" auslesen, Speicherleck, Speicherverbrauch
Beitrag von: Torxgewinde am 20 Oktober 2023, 15:35:30
Inspiriert von https://perlmaven.com/how-much-memory-does-the-perl-application-use (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
Titel: Aw: 🫗 Speichernutzung mit "Memory::Usage" auslesen, Speicherleck, Speicherverbrauch
Beitrag von: stobor am 14 Oktober 2024, 20:41:26
Ergänze ich den Code in der fhem.cfg, erkenne ich keinen Mehrwert.

Wie komme ich denn an den beschriebenen Output?
Titel: Aw: 🫗 Speichernutzung mit "Memory::Usage" auslesen, Speicherleck, Speicherverbrauch
Beitrag von: mumpitzstuff am 15 Oktober 2024, 02:12:24
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.
Titel: Aw: 🫗 Speichernutzung mit "Memory::Usage" auslesen, Speicherleck, Speicherverbrauch
Beitrag von: stobor am 15 Oktober 2024, 10:49:19
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