Xref: feenix.metronet.com comp.sys.sun.admin:6695
Newsgroups: comp.sys.sun.admin
Path: feenix.metronet.com!news.ecn.bgu.edu!wupost!howland.reston.ans.net!xlink.net!rz.uni-karlsruhe.de!stepsun.uni-kl.de!uklirb!bogner.informatik.uni-kl.de!lott
From:
[email protected] (Christopher Lott)
Subject: Re: How much "free memory" is too little?
Message-ID: <
[email protected]>
Sender:
[email protected] (Unix-News-System)
Nntp-Posting-Host: bogner.informatik.uni-kl.de
Organization: Universitaet Kaiserslautern FB Informatik
References: <
[email protected]> <
[email protected]> <
[email protected]>
Date: Thu, 3 Jun 1993 08:17:29 GMT
Lines: 70
In article <baz>
[email protected] (Mario Nigrovic) writes:
>To discover how much physical memory is used, look at the RSS fields
>in PS. You'll find a large hole between (physical - RSS_total) and
>(free_memory). The former is the *real* available memory.
Here is a variant on that idea. This perl script totals up the SIZE
fields from top. The top program gives text + stack + data in that
column, which I felt was the data that I want. According to the man
page for ps, it shows in its SIZE column just stack + data and the
resident set size in RSS.
chris...
--snip--
#!/usr/local/bin/perl
# a script to total the SIZE fields from top
# permission to use, abuse, modify, fold, spindle, and mutilate granted
# please send improvements to me, I'm interested in seeing them.
#
# cml 920603,
[email protected]
open(TOP, "top -buSI max | ") || die "Can't open a pipe?\n";
# skip the first 3 lines: lastpid/process count/blank
for ($i = 0; $i < 3 && <TOP>; $i++) { }
# grab the content of the 4th line, which looks like this:
# Memory: 29136K available, 23976K in use, 5160K free, 1540K locked
# ^^^^^^ ^^^^^^
$_ = <TOP>;
chop;
($m, $av, $a, $in, $rest) = split(' ', $_, 5);
$available = int($av);
$inuse = int($in);
# skip lines 5-7
for ($i = 4; $i < 7 && <TOP>; $i++) { }
# now process the lines from top
while (<TOP>) {
# remove trailing newline
chop;
# split line at whitespace; just keep the first 5 fields
($pid, $uid, $pri, $nice, $size, $rest) = split(' ', $_, 6);
# extract just the numerical part
$numsize = int($size);
# print $size, " ", $numsize, "\n";
# add up
$total = $total + $numsize;
}
close(TOP);
# sanity check
if ($available == 0 || $inuse == 0 || $total == 0) {
print "Detected nonsense from top:\n";
printf("available = %d, inuse = %d, total = %d\n",
$available, $inuse, $total);
exit 1;
}
printf("O/S reports %d of %d, or %.0f%% in use\n",
$inuse, $available, ($inuse/$available) * 100);
printf("Top computes %d of %d, or %.0f%% in use\n",
$total, $available, ($total/$available) * 100);
--snip--
--
"Christopher Lott
[email protected] +49 (631) 205-3334, -3331 Fax"
"Post: FB Informatik - Bau 57, Universitaet KL, 67653 Kaiserslautern, Germany"