in reply to best way to monitor real memory usage on linux

You could read in and parse /proc/meminfo for that - it has labels in the first column which are pretty self-explanatory.

One world, one people

  • Comment on Re: best way to monitor real memory usage on linux

Replies are listed 'Best First'.
Re^2: best way to monitor real memory usage on linux
by mariog (Acolyte) on Aug 06, 2015 at 14:11 UTC
    No I cannot, the perl script will be running from a windows because the appliance is in a foreign network and the only gateway to that network is a windows server. so I check the memory status of the appliance in the windows with perl+snmp and feed the results to nagios using nsclient and nrpe.
      OK but I believe the value for free memory returned by SNMP has already deducted what is being used for buffers and cache. So either you could settle for that (the usual approach) or you'd need read access to the remote filesystem for what I previously suggested.

      One world, one people

        Hello, unfortunately that is not the case, snmp has several oid for real memory, swap, etc...
        UCD-SNMP-MIB::memIndex.0 = INTEGER: 0 UCD-SNMP-MIB::memErrorName.0 = STRING: swap UCD-SNMP-MIB::memTotalSwap.0 = INTEGER: 8385920 kB UCD-SNMP-MIB::memAvailSwap.0 = INTEGER: 8385920 kB UCD-SNMP-MIB::memTotalReal.0 = INTEGER: 8240104 kB UCD-SNMP-MIB::memAvailReal.0 = INTEGER: 2576224 kB UCD-SNMP-MIB::memTotalFree.0 = INTEGER: 10962144 kB UCD-SNMP-MIB::memMinimumSwap.0 = INTEGER: 16000 kB UCD-SNMP-MIB::memBuffer.0 = INTEGER: 326776 kB UCD-SNMP-MIB::memCached.0 = INTEGER: 4740904 kB
        I have written the following nagios plugins that would take into account buffered and cached when calculating free memory...
        #!C:\Dwimperl\perl\bin use strict; use warnings; use Net::SNMP; use Nagios::Plugin; use nagios::Plugin::Getopt; use Math::Round; my $np; $np=Nagios::Plugin->new( usage => "Usage: %s -H <host> -C <community> -w <warn> -c +<crit>", shortname => "SNMP Memory", timeout => 5, blurb => "this plugin calculates the real used memory in l +inux which includes the cache and buffers", extra => " Examples: check_snmp_mem.pl -H 127.0.0.1 -C public -w 90 -c 95 " ); # plugin arguments $np->add_arg( spec => "host|H=s", help => "ip address or hostname of device", required => 1, ); $np->add_arg( spec => "community|C=s", help => "snmp community string", required => 1, ); $np->add_arg( spec => "warning|w=i", help => "usage in percent, when a WARNING is returned", required => 1, ); $np->add_arg( spec => "critical|c=i", help => " mem usage in percent, when a CRITICAL is returned +", required => 1, ); $np->getopts; # perform sanity checking on command line options if ( (defined $np->opts->warning) && ($np->opts->warning < 0 || $np->o +pts->warning > 100) ) { $np->nagios_die( " invalid number supplied for the -w option: ente +r a value between 0 and 100 " ); } if ( (defined $np->opts->warning) && ($np->opts->critical < 0 || $np-> +opts->critical > 100) ) { $np->nagios_die( " invalid number supplied for the -c option: ente +r a value between 0 and 100 " ); } if ( (defined $np->opts->warning) && ( $np->opts->warning > $np->opts- +>critical) ) { $np->nagios_die( " invalid number supplied for the -w option: warn +ing threshold should be smaller than critical threshold " ); } my $memRealTotalOID = '.1.3.6.1.4.1.2021.4.5.0'; my $memRealFreeOID = '.1.3.6.1.4.1.2021.4.6.0'; my $memRealCachedOID = '.1.3.6.1.4.1.2021.4.15.0'; my $memRealBuffersOID = '.1.3.6.1.4.1.2021.4.14.0'; my ($session, $error) = Net::SNMP->session( -hostname => $np->opts->host, -community => $np->opts->community, ); if (!defined $session) { $np->nagios_exit (WARNING, $error) #printf "ERROR: %s.\n", $error; } my $memRealFree = $session->get_request(-varbindlist => [ $memRealF +reeOID],); my $memRealTotal = $session->get_request(-varbindlist => [ $memReal +TotalOID],); my $memRealCached = $session->get_request(-varbindlist => [ $memRea +lCachedOID],); my $memRealBuffers = $session->get_request(-varbindlist => [ $memRe +alBuffersOID],); $session->close(); my $buffers = $memRealBuffers->{$memRealBuffersOID}; my $cache = $memRealCached->{$memRealCachedOID}; my $total= $memRealTotal->{$memRealTotalOID}; my $free = $memRealFree->{$memRealFreeOID}; my $memRealUsed = $total - $free; my $memRealUsedMB = round ($memRealUsed / 1024); my $totalMB = round($total / 1024); my $realTPercent = (($memRealUsed - $buffers - $cache)/ $total) * 10 +0; my $realPercent = sprintf "%.2f", $realTPercent; $np->add_perfdata( label => "Free", value => $free, uom => "KB" ); $np->add_perfdata( label => "Total", value => $total, uom => "KB" ); $np->add_perfdata( label => "Cached", value => $cache, uom => "KB" ); $np->add_perfdata( label => "Buffered", value => $buffers, uom => "KB" ); ##################################################################### +######### # check the result against the defined warning and critical thresholds +, # output the result and exit $np->nagios_exit( return_code => $np->check_threshold($realPercent), message => " used: $realPercent% with $memRealUsedMB MB of $total +MB MB free" );
        I just want to know if there not a way to calculate the available memory without dubbling the variables? line 82 onwards from my script.