Uname: Linux web3.us.cloudlogin.co 5.10.226-xeon-hst #2 SMP Fri Sep 13 12:28:44 UTC 2024 x86_64
Software: Apache
PHP version: 8.1.31 [ PHP INFO ] PHP os: Linux
Server Ip: 162.210.96.117
Your Ip: 18.191.200.21
User: edustar (269686) | Group: tty (888)
Safe Mode: OFF
Disable Function:
NONE

name : MemStats.pm
=head1 NAME

Sys::Statistics::Linux::MemStats - Collect linux memory information.

=head1 SYNOPSIS

    use Sys::Statistics::Linux::MemStats;

    my $lxs  = Sys::Statistics::Linux::MemStats->new;
    my $stat = $lxs->get;

=head1 DESCRIPTION

Sys::Statistics::Linux::MemStats gathers memory statistics from the virtual F</proc> filesystem (procfs).

For more information read the documentation of the front-end module L<Sys::Statistics::Linux>.

=head1 MEMORY INFORMATIONS

Generated by F</proc/meminfo>.

    memused         -  Total size of used memory in kilobytes.
    memfree         -  Total size of free memory in kilobytes.
    memusedper      -  Total size of used memory in percent.
    memtotal        -  Total size of memory in kilobytes.
    buffers         -  Total size of buffers used from memory in kilobytes.
    cached          -  Total size of cached memory in kilobytes.
    realfree        -  Total size of memory is real free (memfree + buffers + cached).
    realfreeper     -  Total size of memory is real free in percent of total memory.
    swapused        -  Total size of swap space is used is kilobytes.
    swapfree        -  Total size of swap space is free in kilobytes.
    swapusedper     -  Total size of swap space is used in percent.
    swaptotal       -  Total size of swap space in kilobytes.
    swapcached      -  Memory that once was swapped out, is swapped back in but still also is in the swapfile.
    active          -  Memory that has been used more recently and usually not reclaimed unless absolutely necessary.
    inactive        -  Memory which has been less recently used and is more eligible to be reclaimed for other purposes.
                       On earlier kernels (2.4) Inact_dirty + Inact_laundry + Inact_clean.

    The following statistics are only available by kernels from 2.6.

    slab            -  Total size of memory in kilobytes that used by kernel for data structure allocations.
    dirty           -  Total size of memory pages in kilobytes that waits to be written back to disk.
    mapped          -  Total size of memory in kilbytes that is mapped by devices or libraries with mmap.
    writeback       -  Total size of memory that was written back to disk.
    committed_as    -  The amount of memory presently allocated on the system.

    The following statistic is only available by kernels from 2.6.9.

    commitlimit     -  Total amount of memory currently available to be allocated on the system.

=head1 METHODS

=head2 new()

Call C<new()> to create a new object.

    my $lxs = Sys::Statistics::Linux::MemStats->new;

It's possible to set the path to the proc filesystem.

     Sys::Statistics::Linux::MemStats->new(
        files => {
            # This is the default
            path    => '/proc',
            meminfo => 'meminfo',
        }
    );

=head2 get()

Call C<get()> to get the statistics. C<get()> returns the statistics as a hash reference.

    my $stat = $lxs->get;

=head1 EXPORTS

No exports.

=head1 SEE ALSO

B<proc(5)>

=head1 REPORTING BUGS

Please report all bugs to <jschulz.cpan(at)bloonix.de>.

=head1 AUTHOR

Jonny Schulz <jschulz.cpan(at)bloonix.de>.

=head1 COPYRIGHT

Copyright (c) 2006, 2007 by Jonny Schulz. All rights reserved.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

=cut

package Sys::Statistics::Linux::MemStats;

use strict;
use warnings;
use Carp qw(croak);

our $VERSION = '0.16';

sub new {
    my $class = shift;
    my $opts  = ref($_[0]) ? shift : {@_};

    my %self = (
        files => {
            path    => '/proc',
            meminfo => 'meminfo',
        }
    );

    foreach my $file (keys %{ $opts->{files} }) {
        $self{files}{$file} = $opts->{files}->{$file};
    }

    return bless \%self, $class;
}

sub get {
    my $self    = shift;
    my $class   = ref($self);
    my $file    = $self->{files};
    my %meminfo = ();

    my $filename = $file->{path} ? "$file->{path}/$file->{meminfo}" : $file->{meminfo};
    open my $fh, '<', $filename or croak "$class: unable to open $filename ($!)";

    # MemTotal:      1035648 kB
    # MemFree:         15220 kB
    # Buffers:          4280 kB
    # Cached:          47664 kB
    # SwapCached:     473988 kB
    # Active:         661992 kB
    # Inactive:       314312 kB
    # HighTotal:      130884 kB
    # HighFree:          264 kB
    # LowTotal:       904764 kB
    # LowFree:         14956 kB
    # SwapTotal:     1951856 kB
    # SwapFree:      1164864 kB
    # Dirty:             520 kB
    # Writeback:           0 kB
    # AnonPages:      908892 kB
    # Mapped:          34308 kB
    # Slab:            19284 kB
    # SReclaimable:     7532 kB
    # SUnreclaim:      11752 kB
    # PageTables:       3056 kB
    # NFS_Unstable:        0 kB
    # Bounce:              0 kB
    # CommitLimit:   2469680 kB
    # Committed_AS:  1699568 kB
    # VmallocTotal:   114680 kB
    # VmallocUsed:     12284 kB
    # VmallocChunk:   100992 kB

    # kernel <= 2.4
    # Inact_dirty: 138632 kB
    # Inact_laundry: 35520 kB
    # Inact_clean: 7544 kB

    while (my $line = <$fh>) {
        if ($line =~ /^((?:Mem|Swap)(?:Total|Free)|Buffers|Cached|SwapCached|Active|Inactive|
                        Dirty|Writeback|Mapped|Slab|Commit(?:Limit|ted_AS)):\s*(\d+)/x) {
            my ($n, $v) = ($1, $2);
            $n =~ tr/A-Z/a-z/;
            $meminfo{$n} = $v;
        } elsif ($line =~ /^Inact_(?:dirty|laundry|clean):\s*(\d+)/) {
            $meminfo{inactive} += $1;
        }
    }

    close($fh);

    $meminfo{memused}     = sprintf('%u', $meminfo{memtotal} - $meminfo{memfree});
    $meminfo{memusedper}  = sprintf('%.2f', 100 * $meminfo{memused} / $meminfo{memtotal});
    $meminfo{swapused}    = sprintf('%u', $meminfo{swaptotal} - $meminfo{swapfree});
    $meminfo{realfree}    = sprintf('%u', $meminfo{memfree} + $meminfo{buffers} + $meminfo{cached});
    $meminfo{realfreeper} = sprintf('%.2f', 100 * $meminfo{realfree} / $meminfo{memtotal});

    # maybe there is no swap space on the machine
    if (!$meminfo{swaptotal}) {
        $meminfo{swapusedper} = '0.00';
    } else {
        $meminfo{swapusedper} = sprintf('%.2f', 100 * $meminfo{swapused} / $meminfo{swaptotal});
    }

    return \%meminfo;
}

1;
© 2025 GrazzMean