SIZE vs. RES in top(1) output

2006-02-14 Thread Paul de Weerd
All,

I'm a bit confused on the difference between SIZE and RES in the
output of top(1) (the same goes for VSZ vs RSS in ps(1) output). The
manpage says :

SIZEThe total size of the process (the text, data, and stack
segments).

RES The current amount of resident memory.

Reading the page I'd think they should be equal; I'd say the total
size of the process should equal the amount of resident memory. This
is of course completely wrong (there's two fields for a reason), looking
at a semi-random pair of processes on a system I have running here, I
have one process with a SIZE of 696K and a RES of 19M (SIZE  RES) and
also another one with a SIZE of 176K and a RES of 4K (SIZE  RES).

I figured I'd check the code for more enlightenment. In
/usr/src/usr.bin/top/machine.c I see :

format_k(pagetok(PROCSIZE(pp))),
format_k(pagetok(pp-p_vm_rssize)),

PROCSIZE is #defined as the sum of (pp)-p_vm_[tds]size, but I can not
find how these sizes relate to p_vm_rssize. I eventually end up in
sys/sysctl.h where the kinfo_proc2 structure is defined. It says :

int32_t p_vm_rssize;/* SEGSZ_T: current resident set size 
in pages */
int32_t p_vm_tsize; /* SEGSZ_T: text size (pages) */
int32_t p_vm_dsize; /* SEGSZ_T: data size (pages) */
int32_t p_vm_ssize; /* SEGSZ_T: stack size (pages) */

This, unfortunately, does not clear things up for me, I'd still read
this to mean that rssize = tsize + dsize + ssize. How come SIZE can be
larger or smaller than RES ? Is there any documentation on this ?

The only thing I can think of is that RES does not take swapped out
memory into account (resident as in active and currently loaded in
RAM), but in that case SIZE = RES, never SIZE  RES. And then I also
see SIZE  RES on machines that have never touched swapped since boot,
so that (partially) rules out swap as an answer. Is this perhaps
related to dynamic libraries which are shared between processes and
thus not counted in SIZE but are part of RES (or vice versa) ?
Unlikely to be a good/complete answer, static binaries also have
different values for SIZE and RES.

Anyway, I should probably stop making a fool out of myself by making
any more pointless guesses. Does anyone have a cluebat available for
me ?

Thanks,

Paul 'WEiRD' de Weerd

-- 
[++-]+++.+++[---].+++[+
+++-].++[-]+.--.[-]
 http://www.weirdnet.nl/ 



Re: SIZE vs. RES in top(1) output

2006-02-14 Thread Otto Moerbeek
On Wed, 15 Feb 2006, Paul de Weerd wrote:

 All,
 
 I'm a bit confused on the difference between SIZE and RES in the
 output of top(1) (the same goes for VSZ vs RSS in ps(1) output). The
 manpage says :
 
 SIZE  The total size of the process (the text, data, and stack
   segments).
 
 RES   The current amount of resident memory.
 
 Reading the page I'd think they should be equal; I'd say the total
 size of the process should equal the amount of resident memory. This
 is of course completely wrong (there's two fields for a reason), looking
 at a semi-random pair of processes on a system I have running here, I
 have one process with a SIZE of 696K and a RES of 19M (SIZE  RES) and
 also another one with a SIZE of 176K and a RES of 4K (SIZE  RES).
 
 I figured I'd check the code for more enlightenment. In
 /usr/src/usr.bin/top/machine.c I see :
 
 format_k(pagetok(PROCSIZE(pp))),
 format_k(pagetok(pp-p_vm_rssize)),
 
 PROCSIZE is #defined as the sum of (pp)-p_vm_[tds]size, but I can not
 find how these sizes relate to p_vm_rssize. I eventually end up in
 sys/sysctl.h where the kinfo_proc2 structure is defined. It says :
 
 int32_t p_vm_rssize;/* SEGSZ_T: current resident set size 
 in pages */
 int32_t p_vm_tsize; /* SEGSZ_T: text size (pages) */
 int32_t p_vm_dsize; /* SEGSZ_T: data size (pages) */
 int32_t p_vm_ssize; /* SEGSZ_T: stack size (pages) */
 
 This, unfortunately, does not clear things up for me, I'd still read
 this to mean that rssize = tsize + dsize + ssize. How come SIZE can be
 larger or smaller than RES ? Is there any documentation on this ?
 
 The only thing I can think of is that RES does not take swapped out
 memory into account (resident as in active and currently loaded in
 RAM), but in that case SIZE = RES, never SIZE  RES. And then I also
 see SIZE  RES on machines that have never touched swapped since boot,
 so that (partially) rules out swap as an answer. Is this perhaps
 related to dynamic libraries which are shared between processes and
 thus not counted in SIZE but are part of RES (or vice versa) ?
 Unlikely to be a good/complete answer, static binaries also have
 different values for SIZE and RES.

Yes, shared pages complicate matters a lot. Also, there are pages
(like code or other r/o pages) that are counted in SIZE, but are not
paged in, so they are not counted in RES.

-Otto

 
 Anyway, I should probably stop making a fool out of myself by making
 any more pointless guesses. Does anyone have a cluebat available for
 me ?
 
 Thanks,
 
 Paul 'WEiRD' de Weerd
 
 -- 
 [++-]+++.+++[---].+++[+
 +++-].++[-]+.--.[-]
  http://www.weirdnet.nl/