Date: Sun, 23 Jan 2011 19:42:32 GMT From: Edward Tomasz Napierala <trasz@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 188108 for review Message-ID: <201101231942.p0NJgWic047964@skunkworks.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@188108?ac=10 Change 188108 by trasz@trasz_victim on 2011/01/23 19:42:24 Don't use %CPU value calculated by the scheduler (sched_pctcpu()); it's averaged over some time and thus not really suitable for what I need here. Instead, calculate %CPU from runtime. Affected files ... .. //depot/projects/soc2009/trasz_limits/sys/kern/kern_container.c#60 edit .. //depot/projects/soc2009/trasz_limits/sys/sys/proc.h#29 edit Differences ... ==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_container.c#60 (text+ko) ==== @@ -765,11 +765,10 @@ static void containerd(void) { - int pctcpu; struct thread *td; struct proc *p; struct timeval wallclock; - uint64_t pctcpu_limit; + uint64_t pctcpu, pctcpu_limit, runtime; for (;;) { loginclass_container_foreach(container_dampen_callback, &hz, @@ -779,27 +778,35 @@ sx_slock(&allproc_lock); FOREACH_PROC_IN_SYSTEM(p) { - pctcpu_limit = rusage_get_limit(p, RUSAGE_PCTCPU); - pctcpu = 0; + microuptime(&wallclock); + timevalsub(&wallclock, &p->p_stats->p_start); + pctcpu_limit = rusage_get_available(p, RUSAGE_PCTCPU); PROC_LOCK(p); PROC_SLOCK(p); FOREACH_THREAD_IN_PROC(p, td) { ruxagg(p, td); thread_lock(td); - pctcpu += sched_pctcpu(td); thread_unlock(td); } + runtime = cputick2usec(p->p_rux.rux_runtime); PROC_SUNLOCK(p); - pctcpu = ((pctcpu * 10000 + FSCALE / 2) >> FSHIFT) / 100; +#ifdef notyet + KASSERT(runtime >= p->p_prev_runtime, + ("runtime < p_prev_runtime")); +#else + if (runtime < p->p_prev_runtime) + runtime = p->p_prev_runtime; +#endif + pctcpu = (runtime - p->p_prev_runtime) / 10000; + p->p_prev_runtime = runtime; if (pctcpu > pctcpu_limit) rusage_throttle(p, 1); else rusage_throttle(p, 0); - microuptime(&wallclock); - timevalsub(&wallclock, &p->p_stats->p_start); - rusage_set(p, RUSAGE_WALLCLOCK, wallclock.tv_sec * 1000000 + wallclock.tv_usec); + rusage_set(p, RUSAGE_CPU, runtime); rusage_set(p, RUSAGE_PCTCPU, pctcpu); - rusage_set(p, RUSAGE_CPU, cputick2usec(p->p_rux.rux_runtime)); + rusage_set(p, RUSAGE_WALLCLOCK, + wallclock.tv_sec * 1000000 + wallclock.tv_usec); PROC_UNLOCK(p); } sx_sunlock(&allproc_lock); ==== //depot/projects/soc2009/trasz_limits/sys/sys/proc.h#29 (text+ko) ==== @@ -526,6 +526,7 @@ int p_boundary_count;/* (c) Num threads at user boundary */ int p_pendingcnt; /* how many signals are pending */ struct itimers *p_itimers; /* (c) POSIX interval timers. */ + uint64_t p_prev_runtime; /* (c) Resource usage accounting. */ /* End area that is zeroed on creation. */ #define p_endzero p_magic @@ -559,7 +560,7 @@ LIST_HEAD(, mqueue_notifier) p_mqnotifier; /* (c) mqueue notifiers.*/ struct kdtrace_proc *p_dtrace; /* (*) DTrace-specific data. */ struct cv p_pwait; /* (*) wait cv for exit/exec */ - struct container p_container; /* (*) resource usage accounting */ + struct container p_container; /* (*) Resource usage accounting. */ }; #define p_session p_pgrp->pg_session
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201101231942.p0NJgWic047964>