[prev in list] [next in list] [prev in thread] [next in thread] 

List:       apache-modperl-dev
Subject:    Re: Apache::SizeLimit
From:       Perrin Harkins <perrin () elem ! com>
Date:       2003-11-25 15:45:18
[Download RAW message or body]

Vivek Khera wrote:
> I think that the docs for freebsd should note that the shared size
> computation is totally incorrect -- as it is now it only gives you the
> shared text segment, which is essentially only the compiled C code
> parts of perl.

Yes.  Here's a complete answer on the subject from Doug Steinwand, who 
wrote the FreeBSD support:

> Unfortunately, FreeBSD does not track shared memory like Linux does.
> The getrusage() system call is rather old-school, and the values
> returned from it do not account for copy-on-write memory that occurs
> after a fork(). In other words, the size of the process's text pages
> (ru_ixrss) is the only useful measurement of shared memory that I
> know of.
> 
> So, ru_idrss and ru_isrss return the "unshared" memory used by the
> data and stack segments respectively, but ru_idrss does not subtract
> for copy-on-write, so there's not much point in returning it in
> Apache::SizeLimit.
> 
> Furthermore, the values returned by these integral elements (ru_ixrss,
> ru_idrss, ru_isrss) must be divided by the number of ticks that the
> process has been executing. This can be done with the code below,
> but it's too not pretty.
> 
> use BSD::Resource;
> use POSIX;
> 
> # returns (total size, shared) via getrusage()
> # Note that shared is just the size of text pages. BSD
> # doesn't calculate the size of pages shared between data pages
> # in different processes.
> sub bsd_size_check {
>   my @u = BSD::Resource::getrusage( BSD::Resource::RUSAGE_SELF );
>   my $clock_ticks = POSIX::sysconf( POSIX::_SC_CLK_TCK );
> 
>   # total clock ticks that we've been executing
>   my $t = $u[0] * $clock_ticks;
> 
>   # too small to calculate, just return maxrss
>   if ($t < 0.0001) {
>     return ($u[2], 0);
>   }
> 
>   my $xrss = $u[3] / $t;         # shared memory (text) size
>   my $drss = $u[4] / $t;         # unshared data size
>   my $srss = $u[5] / $t;         # unshared stack size
> 
>   return ($xrss + $drss + $srss, $xrss);
> }
> 
> __END__
> 
> So, I don't think FreeBSD will return what the mod_perl folks are
> looking for here. The other BSD's are likely the same, but I'm not
> 100% sure. Sorry.

- Perrin




---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@perl.apache.org
For additional commands, e-mail: dev-help@perl.apache.org

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic