🫗 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