[sf-lug] sf-lug Digest, Vol 31, Issue 20
Rick Moen
rick at linuxmafia.com
Mon Jun 9 10:01:24 PDT 2008
Yesterday, I wrote:
> Particularly on a RAM-constrained machine:
>
> o You need to know _why_ you're running each process (i.e., know what
> happens if you kill it, and know why that would be A Bad Thing).
I really should have elaborated on the above, and will do so now:
Let's say (and this particular example happens _a great deal_ on low-RAM
systems you've just installed Debian onto someone's 64MB RAM P200 laptop,
and the output of "ps auxw | more" (the process table) includes a line
for process "portmap", something like this:
daemon 11064 0.0 0.1 1664 456 ? Ss May22 0:00 /sbin/portmap
The laptop's running OK, and you're thinking: I don't know much about
"portmap", and don't know if it's a needed process or not. How do I tell?
Good question. The way you tell is: Kill it ("killall portmap", run as
the root user), make sure the process is indeed gone, and see if
anything is no longer working that you care about.
That's the core of the matter, right there: If you kill a process and
don't miss it, then by a functional definition it's an unnecessary
process, and you should go disable its autostartup for subsequent
bootups.
Now, the above might strike you as a bit hasty: Might the effects be
subtle and noticed only later after you forgot what you'd killed and
why? Probably not but maybe yes. Which is one reason why you should
_take notes_ while setting up a system. Those notes are (then) your
safety net, enabling you to know what you did and if necessary
backtrack.
(Also, you would want to Web-search the process name. If you did, you'd
find out that "portmap" is a network service used by Network File
System = NFS, Network Information System = NIS, GNOME's "FAM" = file
access monitor, and some very obscure other services. You would likely
conclude that, indeed, you don't need it.)
> o In order to understand where the RAM goes, you need to be able to
> read and interpret the RAM statistics of "ps auxw" or some
> equivalent command. In particular, you need to understand what the
> "RSS" and "Shared" columns mean.
"RSS" here does not stand for Really Simple Syndication, but rather
Resident Set Size, which is the amount of _physical_ (as opposed to
swap) memory that the process is taking up at the moment.
The other field I was thinking of in "ps" is not called "Shared" (which
is a field in the similar "top" utility) but rather "VSZ" which stands
for "virtual size". As you will see here...
http://lwn.net/Articles/230975/
...it's _supposed_ to be the footprint of the entire process including
virtual memory (swap), but, for mindnumbingly obscure reasons having to
do with kernel memory-management tricks, it's not a very reliable
measure of that total process size.
A bit more meaningful is the SHR (shared memory) field in the output of
"top". E.g., here are all the "named" (BIND9) instances running on my
server:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
697 bind 18 0 3996 3584 1496 S 5.5 1.4 13:18.55 named
695 bind 9 0 3996 3584 1496 S 0.0 1.4 0:00.01 named
696 bind 9 0 3996 3584 1496 S 0.0 1.4 0:00.18 named
698 bind 9 0 3996 3584 1496 S 0.0 1.4 0:07.30 named
699 bind 10 0 3996 3584 1496 S 0.0 1.4 1:54.60 named
The "RES" = Resident Set Size of each instance is 3.5MB (reporting units
being kB), and shared memory is 1.5MB. Although SHR is just memory that
the process _potentially_ shares with other processes, it seems a very
fair bet, here, that it's truly common code among the BIND9 instances.
So, each process's true full size is probably somewhere between the RSS
("RES") figure of 3.5MB and the "VIRT" (same as ps's "VSZ") size of 4MB,
with about 1.5MB common between them. So, a rough estimate of RAM
grabbed by BIND9 is:
(3.75MB - 1.5MB) * 5, plus shared code of 1.5MB = 12.75MB.
It's possible to make better estimates of true RAM usage (see URL,
above), but the above sort of shirtsleeve calculation tends to be good
enough.
More information about the sf-lug
mailing list