ossp-pkg/snmpdx/snmpdx.d/sysVM.pm
1.2
##
## snmpdx -- SNMP Daemon Extension
## Copyright (c) 2003 The OSSP Project <http://www.ossp.org/>
## Copyright (c) 2003 Ralf S. Engelschall <rse@engelschall.com>
## Copyright (c) 2003 Cable & Wireless <http://www.cw.com/>
##
## Permission to use, copy, modify, and distribute this software for
## any purpose with or without fee is hereby granted, provided that
## the above copyright notice and this permission notice appear in all
## copies.
##
## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
## SUCH DAMAGE.
##
## sysVM: System Vritual Memory
##
package My::Probe::sysVM;
our @ISA = qw(My::Probe);
sub oids ($) {
my ($self) = @_;
return $self->{-ctx}->{-mib}->oids("*.snmpdx.host.system.sysVM.*");
}
sub probe ($$) {
my ($self, $obj) = @_;
if ($self->{-ctx}->{-platform}->id() =~ m/FreeBSD/i) {
# sysVMRamMax sysctl -n hw.physmem
# sysVMRamUsed vmstat: avm
# sysVMRamFree sysVMRamMax - sysVMRamUsed
# sysVMSwapMax swapinfo -k | tail -1
# sysVMSwapUsed swapinfo -k | tail -1
# sysVMSwapFree sysVMSwapMax - sysVMSwapUsed
# sysVMActivity vmstat: pi+po
}
elsif ($self->{-ctx}->{-platform}->id() =~ m/Linux/i) {
# sysVMRamMax /proc/meminfo:MemTotal
# sysVMRamUsed /proc/meminfo:MemTotal-Buffers-Cached-MemFree
# sysVMRamFree sysVMRamMax - sysVMRamUsed
# sysVMSwapMax /proc/meminfo:SwapTotal
# sysVMSwapUsed sysVMSwapMax - sysVMSwapFree
# sysVMSwapFree /proc/meminfo:SwapFree
}
elsif ($self->{-ctx}->{-platform}->id() =~ m/SunOS/i) {
# sysVMRamMax "/usr/platform/$arch/sbin/prtdiag", Memory size
# sysVMRamUsed sysVMRamMax - sysVMRamFree
# sysVMRamFree "/bin/pagesize" * "/bin/sar -r 1 1", freemem, convert bytes to MB
#
if ($obj->{-name} =~ m/\.sysVMRam(Max|Used|Free)$/) {
my $sysVMRamMax = undef;
my $sysVMRamUsed = undef;
my $sysVMRamFree = undef;
# initialize arch; get or assume pagesize(1)
my $arch = $self->{-ctx}->{-platform}->arch();
my $out = $self->{-ctx}->{-sys}->run("/bin/pagesize", "forever");
my $pagesize = $out->{-stdout} || 4096;
# sysVMRamMax
my $out = $self->{-ctx}->{-sys}->run("/usr/platform/$arch/sbin/prtdiag -v", "1m");
my $raw = $out->{-stdout};
if ($raw =~ m/\nMemory size: (\d+) Megabytes/s) {
$sysVMRamMax = $1;
}
# sysVMRamFree
my $out = $self->{-ctx}->{-sys}->run("/bin/sar -r 1 1", "1m");
my $raw = $out->{-stdout};
my $i_sarr = {};
if ($raw =~ m/^.*\n([^\n]*\bfreemem[^\n]*)\n(.*)$/s) {
$i_sarr = &n2i(split / +/, $1) if (scalar keys %$i_sarr == 0);
}
@data = split(/ +/, $2);
if (defined $i_sarr->{freemem}) {
$sysVMRamFree = 0 if (not defined $sysVMRamFree);
$sysVMRamFree += @data[$i_sarr->{freemem}];
}
$sysVMRamFree = int($sysVMRamFree * $pagesize / 1024 / 1024) if (defined $sysVMRamFree);
# sysVMRamUsed
if (defined $sysVMRamMax and defined $sysVMRamFree) {
$sysVMRamUsed = $sysVMRamMax - $sysVMRamFree;
}
$obj->{-value} = $sysVMRamMax if ($obj->{-name} =~ m/\.sysVMRamMax$/);
$obj->{-value} = $sysVMRamUsed if ($obj->{-name} =~ m/\.sysVMRamUsed$/);
$obj->{-value} = $sysVMRamFree if ($obj->{-name} =~ m/\.sysVMRamFree$/);
}
# sysVMSwapMax "swap -l", egrep ^/ and accumulate, convert 512byte blocks to MB
# sysVMSwapUsed sysVMSwapMax - sysVMSwapFree
# sysVMSwapFree "swap -l", egrep ^/ and accumulate, convert 512byte blocks to MB
#
if ($obj->{-name} =~ m/\.sysVMSwap(Max|Used|Free)$/) {
my $sysVMSwapMax = undef;
my $sysVMSwapUsed = undef;
my $sysVMSwapFree = undef;
# sysVMSwapMax, sysVMSwapFree
my $out = $self->{-ctx}->{-sys}->run("/usr/sbin/swap -l", "1m");
my $raw = $out->{-stdout};
my $i_swapl = {};
if ($raw =~ m/^\s*([^\n]*\bblocks[^\n]*\bfree[^\n]*)\n(.*)$/s) {
$i_swapl = &n2i(split / +/, $1) if (scalar keys %$i_swapl == 0);
}
foreach my $r (split /\n/, $2) {
if ($r =~ m/^\//) {
@data = split(/ +/, $r);
if (defined $i_swapl->{blocks}) {
$sysVMSwapMax = 0 if (not defined $sysVMSwapMax);
$sysVMSwapMax += @data[$i_swapl->{blocks}];
}
if (defined $i_swapl->{free}) {
$sysVMSwapFree = 0 if (not defined $sysVMSwapFree);
$sysVMSwapFree += @data[$i_swapl->{free}];
}
}
}
$sysVMSwapMax = int($sysVMSwapMax * 512 / 1024 / 1024) if (defined $sysVMSwapMax);
$sysVMSwapFree = int($sysVMSwapFree * 512 / 1024 / 1024) if (defined $sysVMSwapFree);
# sysVMSwapUsed
if (defined $sysVMSwapMax and defined $sysVMSwapFree) {
$sysVMSwapUsed = $sysVMSwapMax - $sysVMSwapFree;
}
$obj->{-value} = $sysVMSwapMax if ($obj->{-name} =~ m/\.sysVMSwapMax$/);
$obj->{-value} = $sysVMSwapUsed if ($obj->{-name} =~ m/\.sysVMSwapUsed$/);
$obj->{-value} = $sysVMSwapFree if ($obj->{-name} =~ m/\.sysVMSwapFree$/);
}
# sysVMActivity "/bin/vmstat", sr column
#
if ($obj->{-name} =~ m/\.sysVMActivity$/) {
my $value = undef;
my $out = $self->{-ctx}->{-sys}->run("/bin/vmstat", "1m");
my $raw = $out->{-stdout};
my $i_vmstat = {};
if ($raw =~ m/^[^\n]*\n *([^\n]*\bsr\b[^\n]*)\n *([^\n]*)\n$/s) {
$i_vmstat = &n2i(split / +/, $1) if (not defined $i_vmstat->{sr});
}
if (defined $i_vmstat->{sr}) {
my @data = split(/ +/, $2);
$value = @data[$i_vmstat->{sr}];
}
$obj->{-value} = $value;
}
}
return;
}
# name to index
sub n2i ($) {
my (@name) = @_;
my $rc = {};
my $i = 0;
foreach my $f (@name) {
$rc->{$f} = $i++;
};
return $rc;
}
1;