shell bypass 403
=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;