rusage breakdown and cpu limits.

Jeff Roberson jroberson at chesapeake.net
Tue May 29 19:19:40 UTC 2007


On Tue, 29 May 2007, John Baldwin wrote:

> On Tuesday 29 May 2007 02:01:36 pm Jeff Roberson wrote:
>> I'm working with Attilio to break down rusage further to be per-thread in
>> places where it is protected by the global scheduler lock.  To support
>> this, I am interested in moving the rlimit cpulimit check into userret(),
>> or perhaps ast().  Is there any reason why we need to check this on every
>> context switch?  Any objections to moving it?  Eventually it will require
>> a different lock from the one we obtain to call mi_switch().
>
> I think using a per-process spin lock (or a pool of spin locks) would be a
> good first step.  I wouldn't do anything more complicated unless the simple
> approach doesn't work.  The only reason to not move the check into userret()
> would be if one is worried about threads chewing up CPU time while they are
> in the kernel w/o bouncing out to userland.  Also, it matters which one
> happens more often (userret() vs mi_switch()).  If on average threads perform
> multiple system calls during a single time slice (no idea if this is true or
> not), then moving the check to userret() would actually hurt performance.

The problem with using a pool or per-process spinlock is that it keeps the 
contention in the process domain, rather than thread domain.  For 
multithreaded processes this will give the same contention as a global 
scheduler lock, only slightly reduced in scope.  I'd like to solve this in 
such a way that we don't have to revisit it again.

I think I'm going to make the rusage struct per-thread and aggregate it 
on demand.  There will be a lot of code churn, but it will be simple. 
There are a few cases where which will be complicated, and cpulimit is one 
of them.

Jeff

>
> -- 
> John Baldwin
>


More information about the freebsd-arch mailing list