--- sysVM.pm 2003/09/03 09:22:03 1.1
+++ sysVM.pm 2003/09/03 15:41:04 1.2
@@ -36,21 +36,141 @@
sub probe ($$) {
my ($self, $obj) = @_;
- # FreeBSD Linux Solaris
- #Mem Total sysctl -n hw.physmem /proc/meminfo:MemTotal /usr/platform/`uname -i`/sbin/prtdiag:Memory size
- #Mem Used vmstat: avm /proc/meminfo:MemTotal-Buffers-Cached-MemFree "total" - "free"
- #Mem Free "total"-"used" "total"-"used" sar -r 1 1: freemem * `pagesize`
- #Mem Status N.A. N.A. /usr/platform/`uname -i`/sbin/prtdiag:Status col.
- #
- #Swap Total swapinfo -k | tail -1 /proc/meminfo:SwapTotal swap -l: blocks * 512 (accumulate)
- #Swap Used swapinfo -k | tail -1 "total" - "free" "total"-"free"
- #Swap Free "total"-"used" /proc/meminfo:SwapFree swap -l: free * 512 (accumulate)
- #
- #Mem/Swap vmstat: pi+po vmstat: si+so vmstat: sr
- #Page Activity
-
+ 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;
|