Date: Wed, 30 Sep 2009 19:40:51 +0000 (UTC) From: Zachary Loafman <zml@FreeBSD.org> To: cvs-src-old@freebsd.org Subject: cvs commit: src/sys/kern sched_ule.c Message-ID: <200909301941.n8UJfDS5069574@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
zml 2009-09-30 19:40:51 UTC FreeBSD src repository Modified files: (Branch: RELENG_7) sys/kern sched_ule.c Log: SVN rev 197652 on 2009-09-30 19:40:51Z by zml sched_ule in stable/7 has a bug (introduced in r180607) where a thread that is running often will appear to not be running much at all. sched_ule has a much less accurate mechanism for determining how much various threads are running. Every tick, hardclock_cpu() calls sched_tick(), and the currently running thread gets it's ts_ticks incremented. Whenever an event of interest happens to a thread, the ts_ticks value may be decayed; it's supposed to be a rough running average of the last 10 seconds. So there's a ts_ltick which is the last tick we looked at decaying ts_ticks. The increment in sched_tick() was slightly buggy on SMP, because a thread could get incremented on two different CPUs in the rare case where it was swapped from one which had run sched_tick() this tick to one which hadn't. The fix that was used relied on ts_ltick and only incremented ts_ticks if ts_ltick was not from the current tick. This is buggy, because any time the thread began running on a CPU in the current tick, we would have set ts_ltick to ticks, so if it was still running at sched_tick() we wouldn't increment. A system with a single process that hogs the CPU and is otherwise idle, therefore, would look like all threads were at 0%. The threads not running are really at 0%, and the hog is not getting its ts_ticks incremented since it went through some other runq stats that set ts_ltick. On a 2-way SMP the thread used to get shuffled regularly between CPUs (I think fallout from this bug), so it would appear a little over 50% busy. The fix is to use a separate variable to record when the last sched_tick() increment happened. Submitted by: Matthew Fleming (matthew.fleming at isilon.com) Reviewed by: zml, dfr Approved by: dfr (mentor) Revision Changes Path 1.214.2.10 +4 -1 src/sys/kern/sched_ule.c
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200909301941.n8UJfDS5069574>