• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Arbeitsspeicher

Fuechsin

Newbie
Hallo,

möchte gerne ein eigenes Plugin für Nagios schreiben und benötige dafür die Arbeitsspeicherdaten wie free, total, used.

vmstat gibt das aus:

rzvlabwks:/home/nagios/Desktop # vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 12 63628 52024 169172 0 0 1 18 19 2 17 2 81 0


cat /proc/meminfo das:
rzvlabwks:/home/nagios/Desktop # cat /proc/meminfo
MemTotal: 646724 kB
MemFree: 63500 kB
Buffers: 52024 kB
Cached: 169332 kB
SwapCached: 0 kB
Active: 400580 kB
Inactive: 46192 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 646724 kB
LowFree: 63500 kB
SwapTotal: 1310392 kB
SwapFree: 1310380 kB
Dirty: 396 kB
Writeback: 0 kB
Mapped: 305760 kB
Slab: 126112 kB
Committed_AS: 353568 kB
PageTables: 2368 kB
VmallocTotal: 376824 kB
VmallocUsed: 11468 kB
VmallocChunk: 365116 kB
HugePages_Total: 0
HugePages_Free: 0
Hugepagesize: 4096 kB

Da bei vmstat, falsche Werte ausgegeben werden und bei cat /proc/meminfo der free Speicher auch nicht "vollständig" angezeigt werden suche ich etwas anderes...
 

Desti

Member
snaewe , ärger das arme mädel nicht ;)

Würd mich aber auch interessieren warum vmstat verfälschte Ergebnisse liefern soll ?! Wär mir neu ^^
 

Desti

Member
pour toi:

imsstw:~ # vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
2 0 478744 5360 23920 73996 5 41 76 55 119 211 1 5 95 0
imsstw:~ # cat /proc/meminfo
total: used: free: shared: buffers: cached:
Mem: 228327424 223547392 4780032 0 25124864 91488256
Swap: 3002216448 490233856 2511982592
MemTotal: 222976 kB
MemFree: 4668 kB
MemShared: 0 kB
Buffers: 24536 kB
Cached: 74040 kB
SwapCached: 15304 kB
Active: 55080 kB
Inactive: 146604 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 222976 kB
LowFree: 4668 kB
SwapTotal: 2931852 kB
SwapFree: 2453108 kB
BigFree: 0 kB
imsstw:~ #
 
OP
F

Fuechsin

Newbie
vmstat liefert falsche Daten, weil...

#!/usr/bin/perl -w
# $Id: check_mem.pl,v 1.1.1.1 2002/02/28 06:42:54 egalstad Exp $

# check_mem.pl Copyright (C) 2000 Dan Larsson <dl@tyfon.net>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty
# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# you should have received a copy of the GNU General Public License
# along with this program (or with Nagios); if not, write to the
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA

# Tell Perl what we need to use
use strict;
use Getopt::Std;

use vars qw($opt_c $opt_f $opt_u $opt_w
$free_memory $used_memory $total_memory
$crit_level $warn_level
%exit_codes @memlist
$percent $fmt_pct
$verb_err $command_line
$fperc);

# Predefined exit codes for Nagios
%exit_codes = ('UNKNOWN' ,-1,
'OK' , 0,
'WARNING' , 1,
'CRITICAL', 2,);

# Turn this to 1 to see reason for parameter errors (if any)
$verb_err = 0;

# This the unix command string that brings Perl the data
$command_line = `vmstat | tail -1 | awk '{print \$4,\$5}'`;

chomp $command_line;
@memlist = split(/ /, $command_line);

# Define the calculating scalars
$used_memory = $memlist[0];
$free_memory = $memlist[1];
$total_memory = $used_memory + $free_memory;

# Get the options
if ($#ARGV le 0)
{
&usage;
}
else
{
getopts('c:fuw:');
}

# Shortcircuit the switches
if (!$opt_w or $opt_w == 0 or !$opt_c or $opt_c == 0)
{
print "*** You must define WARN and CRITICAL levels!" if ($verb_err);
&usage;
}
elsif (!$opt_f and !$opt_u)
{
print "*** You must select to monitor either USED or FREE memory!" if ($verb_err);
&usage;
}

# Check if levels are sane
if ($opt_w <= $opt_c and $opt_f)
{
print "*** WARN level must not be less than CRITICAL when checking FREE memory!" if ($verb_err);
&usage;
}
elsif ($opt_w >= $opt_c and $opt_u)
{
print "*** WARN level must not be greater than CRITICAL when checking USED memory!" if ($verb_err);
&usage;
}

$warn_level = $opt_w;
$crit_level = $opt_c;

if ($opt_f)
{
$percent = $free_memory / $total_memory * 100;
$fmt_pct = sprintf "%.1f", $percent;
if ($percent <= $crit_level)
{
print "Memory CRITICAL - $fmt_pct% ($free_memory kB) free\n";
exit $exit_codes{'CRITICAL'};
}
elsif ($percent <= $warn_level)
{
print "Memory WARNING - $fmt_pct% ($free_memory kB) free\n";
exit $exit_codes{'WARNING'};
}
else
{
print "Memory OK - $fmt_pct% ($free_memory kB) free\n";
exit $exit_codes{'OK'};
}
}
elsif ($opt_u)
{
$percent = $used_memory / $total_memory * 100;
$fmt_pct = sprintf "%.2f", $percent;
$total_memory = $total_memory / 1024;
$total_memory = sprintf "%.2f", $total_memory;
$used_memory = $used_memory / 1024;
$used_memory = sprintf "%.2f", $used_memory;
$free_memory = $free_memory / 1024;
$free_memory = sprintf "%.2f", $free_memory;
$fperc = $free_memory / $total_memory * 100;
$fperc = sprintf "%.2f", $fperc;
if ($percent >= $crit_level)
{
print "Memory CRITICAL - total: $total_memory MB - used: $used_memory MB ($fmt_pct%)\n";
exit $exit_codes{'CRITICAL'};
}
elsif ($percent >= $warn_level)
{
print "Memory WARNING - total: $total_memory MB - used: $used_memory MB ($fmt_pct%)\n";
exit $exit_codes{'WARNING'};
}
else
{
print "Memory OK - total: $total_memory MB - used: $used_memory MB ($fmt_pct%) - free: $free_memory MB ($fperc%)\n";
exit $exit_codes{'OK'};
}
}

# Show usage
sub usage()
{
print "\ncheck_mem.pl v1.0 - Nagios Plugin\n\n";
print "usage:\n";
print " check_mem.pl -<f|u> -w <warnlevel> -c <critlevel>\n\n";
print "options:\n";
print " -f Check FREE memory\n";
print " -u Check USED memory\n";
print " -w PERCENT Percent free/used when to warn\n";
print " -c PERCENT Percent free/used when critical\n";
print "\nCopyright (C) 2000 Dan Larsson <dl\@tyfon.net>\n";
print "check_mem.pl comes with absolutely NO WARRANTY either implied or explicit\n";
print "This program is licensed under the terms of the\n";
print "GNU General Public License (check source code for details)\n";
exit $exit_codes{'UNKNOWN'};
}


in diesem Plugin wird vmstat genutzt und die Daten die daraus gebildet werden zeigen einen variablen totalspeicher an...
da dieses der fall ist gehe ich stark davon aus, dass vmstat nicht richitg funktioniert.bzw das scipt falsch ist, das hier ja buffer als used angesehen wird... vmstat auf einen anderem system hat anscheinend andere ausgaben. deswegen und meinen kernel baue ich jetzt nicht um, damit die ausgaben passen :)

rzvlabwks:/usr/local/nagios/nagiostat/archives # vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 12 4604 40244 223116 0 0 1 19 31 6 17 2 81 0

rzvlabwks:/home/nagios/Desktop # cat /proc/meminfo
MemTotal: 646724 kB
MemFree: 5736 kB
Buffers: 40248 kB
Cached: 223532 kB
SwapCached: 0 kB
Active: 428760 kB
Inactive: 80196 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 646724 kB
LowFree: 5736 kB
SwapTotal: 1310392 kB
SwapFree: 1310380 kB
Dirty: 744 kB
Writeback: 0 kB
Mapped: 291868 kB
Slab: 121572 kB
Committed_AS: 354656 kB
PageTables: 2416 kB
VmallocTotal: 376824 kB
VmallocUsed: 11468 kB
VmallocChunk: 365116 kB
HugePages_Total: 0
HugePages_Free: 0
Hugepagesize: 4096 kB
 

snaewe

Hacker
Welchen Speicher willst Du denn genau sehen ?
Wenn Du wissen willst, wieviel RAM in deinem Rechner stecken, wirst du mit 'vmstat' nicht weiter kommen.

Stefan
 
OP
F

Fuechsin

Newbie
Ich würde gern den totalen sehen (geht mit cat /proc/meminfo)
und entweder den used oder free, so dass man den anderen errechnen kann... Wenn beides angezeigt würde, wäre es auch nett.
 

snaewe

Hacker
Code:
echo "scale=2;" "$(grep MemTotal /proc/meminfo| awk '{print $2}') / 1024" | bc
zeigt dir den totalen Speicher in MB.
Analog dazu 'MemTotal' durch 'MemFree' ersetzen.

Das ist auch die Ausgabe, die ich von phpSysInfo bekomme.

Das in eine andere Sprache umzusetzen 'is left as an exercise to the reader'

Stefan
 
A

Anonymous

Gast
Es geht natuerlich nochkomplizierter LOL

for a in `cat /proc/iomem|grep RAM|grep -v Video|sed -e 's/-/ /g'|cut -f-2 -d" "|sed -e 's/f/F/g'|sed -e 's/e/E/g'|sed -e 's/d/D/g'|sed -e 's/c/C/g'|sed -e 's/b/B/g'|sed -e 's/a/A/g'`;do x=`echo -e "ibase=16;$a"|bc`;if [ "$f" != "a" ];then f=a;y=`echo $x`;else z=`echo $x`;f=b;g=`echo "$z-$y"|bc -l`;let h=h+g;fi;done;echo $h;unset a f g h x y z

oder noch umstaendlicher ... die werte aus den bios raus hmmm
dd if=/dev/mem bs=1k skip=768 count=256 2>/dev/null | strings -n 8
wird wohl je nach bios wo anders stehen ;-)
vieleicht faellt mir noch was umstaendlichers ein #grins#
post ich dann hehhehe

Mƒg ®êïñï
 

MegaWatt

Newbie
Ähm, der Speicher ist dennoch nicht vollständig:

MemTotal: 312884 kB
/ 1024 = 305 MB

Drin sind aber 320 MB (256 + 64), wo sind die 15 MB hin ?
 
A

Anonymous

Gast
reini123 schrieb:
Es geht natuerlich nochkomplizierter LOL
........
vieleicht faellt mir noch was umstaendlichers ein #grins#
post ich dann hehhehe

da hab ich auch noch ne Idee, wie währe denn das hier,
Code:
cat /var/lib/hardware/unique-keys/$(hwscan --list | grep memory | cut -f1 -d: ) | grep "Res.PhysMemory" | cut -f2 -d"="
sollte zumindestens bei SuSE Hexadezimal den gesammten pysikalischen Speicher ausgeben.

robi
 
Oben