From owner-freebsd-hackers@FreeBSD.ORG Tue Aug 16 13:50:53 2011 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 040021065670; Tue, 16 Aug 2011 13:50:53 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from cyrus.watson.org (cyrus.watson.org [65.122.17.42]) by mx1.freebsd.org (Postfix) with ESMTP id B7F008FC13; Tue, 16 Aug 2011 13:50:52 +0000 (UTC) Received: from bigwig.baldwin.cx (66.111.2.69.static.nyinternet.net [66.111.2.69]) by cyrus.watson.org (Postfix) with ESMTPSA id 70DC446B3B; Tue, 16 Aug 2011 09:50:51 -0400 (EDT) Received: from jhbbsd.localnet (unknown [209.249.190.124]) by bigwig.baldwin.cx (Postfix) with ESMTPSA id 0E11F8A02F; Tue, 16 Aug 2011 09:50:51 -0400 (EDT) From: John Baldwin To: freebsd-hackers@freebsd.org Date: Tue, 16 Aug 2011 09:25:20 -0400 User-Agent: KMail/1.13.5 (FreeBSD/8.2-CBSD-20110617; KDE/4.5.5; amd64; ; ) References: <4E3CC033.6070604@rawbw.com> <20110806091127.GA39951@freebsd.org> <4E3D808F.1030101@rawbw.com> In-Reply-To: <4E3D808F.1030101@rawbw.com> MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <201108160925.20568.jhb@freebsd.org> X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.2.6 (bigwig.baldwin.cx); Tue, 16 Aug 2011 09:50:51 -0400 (EDT) Cc: Yuri , Alexander Best Subject: Re: top(1) loses process user time count when threads end X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 16 Aug 2011 13:50:53 -0000 On Saturday, August 06, 2011 1:57:35 pm Yuri wrote: > On 08/06/2011 02:11, Alexander Best wrote: > > On Fri Aug 5 11, Yuri wrote: > >> I have the process that first runs in 3 threads but later two active > >> threads exit. > >> > >> top(1) shows this moment this way (1 sec intervals): > >> 30833 yuri 3 76 0 4729M 4225M nanslp 4 0:32 88.62% app > >> 30833 yuri 3 76 0 4729M 4225M nanslp 6 0:34 90.92% app > >> 30833 yuri 1 96 0 4729M 4225M CPU1 1 0:03 1.17% app > >> 30833 yuri 1 98 0 4729M 4226M CPU1 1 0:04 12.89% app > >> > >> Process time goes down: 0:34 -> 0:03. Also WCPU goes down 90.92% -> > >> 1.17% even though this process is CPU bound and does intense things > >> right after threads exit. > >> > >> getrusage(2) though, called in the process, shows the correct user time. > >> > >> I think this is the major bug in the process time accounting. > > could you check, whether kern/128177 or kern/140892 describe your situation? > > I have ULE scheduler. kern/128177 talks about single thread with ULE > scheduler, and my issue is with threads. So I am not sure if it is > related. There have been no motion on kern/128177 since Feb 9, 2009. > kern/140892 is probably the same as mine. > > In any case, both these PRs have to be fixed since they are very user > visible, not just some obscure issues. You can try this perhaps: Index: kern/kern_thread.c =================================================================== --- kern/kern_thread.c (revision 224879) +++ kern/kern_thread.c (working copy) @@ -381,7 +381,7 @@ void thread_exit(void) { - uint64_t new_switchtime; + uint64_t runtime, new_switchtime; struct thread *td; struct thread *td2; struct proc *p; @@ -410,15 +410,6 @@ */ cpu_thread_exit(td); /* XXXSMP */ - /* Do the same timestamp bookkeeping that mi_switch() would do. */ - new_switchtime = cpu_ticks(); - p->p_rux.rux_runtime += (new_switchtime - PCPU_GET(switchtime)); - PCPU_SET(switchtime, new_switchtime); - PCPU_SET(switchticks, ticks); - PCPU_INC(cnt.v_swtch); - /* Save our resource usage in our process. */ - td->td_ru.ru_nvcsw++; - rucollect(&p->p_ru, &td->td_ru); /* * The last thread is left attached to the process * So that the whole bundle gets recycled. Skip @@ -467,7 +458,21 @@ PMC_SWITCH_CONTEXT(td, PMC_FN_CSW_OUT); #endif PROC_UNLOCK(p); + + /* Do the same timestamp bookkeeping that mi_switch() would do. */ + new_switchtime = cpu_ticks(); + runtime = new_switchtime - PCPU_GET(switchtime); + td->td_runtime += runtime; + td->td_incruntime += runtime; + PCPU_SET(switchtime, new_switchtime); + PCPU_SET(switchticks, ticks); + PCPU_INC(cnt.v_swtch); + + /* Save our resource usage in our process. */ + td->td_ru.ru_nvcsw++; ruxagg(p, td); + rucollect(&p->p_ru, &td->td_ru); + thread_lock(td); PROC_SUNLOCK(p); td->td_state = TDS_INACTIVE; -- John Baldwin