Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 02 Mar 2006 22:24:17 +0000
From:      Nik Clayton <nik@freebsd.org>
To:        stable@freebsd.org
Subject:   Failing to understand getrusage()
Message-ID:  <44077091.3060604@freebsd.org>

next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------030502040701030607060607
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

I'm failing to understand how getrusage() works, which is a bit perplexing,
because it doesn't seem like it would be terribly complicated.

I've attached the code.  My aim is to verify that I can use getrusage() to
do (admittedly crude) instrumentation of which functions in my program are
allocating lots of memory[1].  So I figure I can call getrusage() at various
points and look at the ru_maxrss member.

I'm confused because the results I'm getting don't make a great deal of
sense.  The attached program, when run 10 times one after the other,
produces the following output;

   before: 0, after: 1300
   before: 0, after: 0
   before: 0, after: 0
   before: 188, after: 188
   before: 0, after: 0
   before: 452, after: 452
   before: 0, after: 0
   before: 0, after: 1316
   before: 0, after: 0
   before: 0, after: 0

'before' is ru_maxrss before 'malloc(1024 * 1024)', 'after' is ru_maxrss 
afterwards.  Different runs produce slightly different numbers -- the point 
is that they vary widely, and in some cases are '0' for both cases.

Those results don't look sane to me.  From doing some googling it looks like 
there may be a delay between the process's resident set size increasing and 
the stats that getrusage() uses being updated.

If that's the case, can I (portably?) wait for the getrusage() stats to 
synchronise before I read them?  If it's not the case, what am I doing 
wrong?  Is there another (portable) mechanism I use to find out how big my 
process is?

N

[1] I'm actually instrumenting Perl applications, using Perl's built-in 
debugger, instrumenting at the Perl level, so solutions of the form "Use 
<this> profiling application" aren't going to be applicable.  I'm using 
BSD::Resource, which wraps getrusage(), and odd results from that led me to 
this C test.

--------------030502040701030607060607
Content-Type: text/plain;
 name="1mb.c"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="1mb.c"

/* Call getrusage() before and after allocating 1MB of RAM, and see what
   the maxrss figure is */

#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>

#include <stdio.h>

int
main(void)
{
	struct rusage  ru;
	char          *ptr;
	int            rc;
	
	rc = getrusage(RUSAGE_SELF, &ru);
	if(rc == -1) {
		perror("getrusage(): ");
		return 1;
	}

	printf("before: %ld, ", ru.ru_maxrss);

	ptr = malloc(1024 * 1024);
	if(ptr == NULL) {
		perror("malloc(): ");
		return 1;
	}
	memset(ptr, 0, 1024 * 1024); /* Zero-fill the memory */

	rc = getrusage(RUSAGE_SELF, &ru);
	if(rc == -1) {
		perror("getrusage(): ");
		return 1;
	}

	printf("after: %ld\n", ru.ru_maxrss);

	free(ptr);

	return 0;
}

--------------030502040701030607060607--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?44077091.3060604>