Date: Tue, 18 Jan 2011 17:01:15 -0800 (PST) From: Mark Terribile <materribile@yahoo.com> To: Chuck Swiger <cswiger@mac.com> Cc: freebsd-questions@freebsd.org Subject: Re: rusage and pthreads Message-ID: <35110.88084.qm@web110316.mail.gq1.yahoo.com> In-Reply-To: <9319A30D-9AC6-46BB-B7EE-A476C88A05ED@mac.com>
next in thread | previous in thread | raw e-mail | index | archive | help
Chuck,=0A=0A> > I'm trying to figure out the interactions between=0A> rusag= e and pthreads.=0A> =0A> There largely isn't any-- struct rusage is per-pro= cess, not=0A> per thread.=0A =0A> > Peeking around in the kernel (7.2) I se= e updates=0A> occurring in various places.=A0 kern_clock.c, for=0A> instanc= e, appears to increment the memory occupancy (*rss)=0A> counters.=A0 This w= ould make it appear that every thread=0A> gets part of the count, but also = that only the process that=0A> happens to have the CPU at that moment gets = its count=0A> updated, even if it holds the memory.=A0 Am I misreading=0A> = this?=0A> =0A> Nope.=A0 statclock() is fired off periodically (with=0A> som= e fuzz, to avoid clever games by processes trying to=0A> avoid being sample= d) to update the stats for the currently=0A> running process.=0A> =0A> > An= d the context switch counters also appear to be=0A> updated per-thread, but= in mi_switch(), in=0A> kern_synch.c.=A0 Is this true?=0A> =0A> Probably.= =0A> =0A> > If the answer is "yes, it's per-thread", then how does=0A> a pr= ocess report its usages without putting the requisite=0A> code in each thre= ad, along with the machinery to divert from=0A> whatever the thread is doin= g (even waiting on I/O) to get=0A> the report at (nearly) the same time in = all threads?=0A> =0A> The process doesn't have userland threads updating th= is=0A> information.=A0 The kernel keeps track of it, and it=0A> updates the= information periodically when the scheduler does=0A> context switches, whe= n statclock() fires off, when disk I/O=0A> completes, etc.=0A=0AI'm looking= at kern_clock.c::statclock(int usermode)=0A=0AThe code in question begins= =0A=0A struct rusage* ru;=0A struct vmspace* vm;=0A st= ruct thread *td;=0A struct proc *p;=0A ...=0A td =3D curthre= ad;=0A p =3D td->td_proc;=0A=0Aand continues further down=0A=0A = ru =3D &td->td_ru;=0A ru->ru_ixrss +=3D pgtok(vm->vm_tsize);=0A = ru->ru_idrss +=3D pgtok(vm->vm_dsize);=0A ru->ru_isrss +=3D pg= tok(vm->vm_ssize);=0A=0AThis looks to me like it's accumulating the data in= per-thread counters. What's more, it's consistent with what I'm seeing on= the user side. Note that this is 7.2; if 8.x behaves differently I'd like= to know.=0A=0A Mark Terribile=0A=0A=0A=0A
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?35110.88084.qm>