|
|
Subscribe / Log in / New account

Re: interactive task starvation

From:  Mike Galbraith <efault-AT-gmx.de>
To:  Ingo Molnar <mingo-AT-elte.hu>
Subject:  Re: interactive task starvation
Date:  Fri, 17 Mar 2006 18:15:21 +0100
Cc:  lkml <linux-kernel-AT-vger.kernel.org>

On Fri, 2006-03-17 at 11:46 +0100, Mike Galbraith wrote:
> On Fri, 2006-03-17 at 10:06 +0100, Ingo Molnar wrote:
> 
> > yep, i think that's a good idea. In the worst case the starvation 
> > timeout should kick in.
> 
> (I didn't want to hijack that thread ergo name change)
> 
> Speaking of the starvation timeout...
> 

<snip day late $ short idea>

Problem solved.  I now know why the starvation logic doesn't work.
Wakeups.  In the face of 10+ copies of httpd constantly waking up, it
seems it just takes ages to get around to switching arrays.

With the (urp) patch below, I now get...

[root]:# time netstat|grep :81|wc -l
   1648

real    0m27.735s
user    0m0.158s
sys     0m0.111s
[root]:# time netstat|grep :81|wc -l
   1817

real    0m13.550s
user    0m0.121s
sys     0m0.186s
[root]:# time netstat|grep :81|wc -l
   1641

real    0m17.022s
user    0m0.132s
sys     0m0.143s
[root]:# 

which certainly isn't pleasant, but it beats the heck out of minutes.

	-Mike

--- kernel/sched.c.org	2006-03-17 14:48:35.000000000 +0100
+++ kernel/sched.c	2006-03-17 17:41:25.000000000 +0100
@@ -662,11 +662,30 @@
 }
 
 /*
+ * We place interactive tasks back into the active array, if possible.
+ *
+ * To guarantee that this does not starve expired tasks we ignore the
+ * interactivity of a task if the first expired task had to wait more
+ * than a 'reasonable' amount of time. This deadline timeout is
+ * load-dependent, as the frequency of array switched decreases with
+ * increasing number of running tasks. We also ignore the interactivity
+ * if a better static_prio task has expired:
+ */
+#define EXPIRED_STARVING(rq) \
+	((STARVATION_LIMIT && ((rq)->expired_timestamp && \
+		(jiffies - (rq)->expired_timestamp >= \
+			STARVATION_LIMIT * ((rq)->nr_running) + 1))) || \
+			((rq)->curr->static_prio > (rq)->best_expired_prio))
+
+/*
  * __activate_task - move a task to the runqueue.
  */
 static inline void __activate_task(task_t *p, runqueue_t *rq)
 {
-	enqueue_task(p, rq->active);
+	prio_array_t *array = rq->active;
+	if (unlikely(EXPIRED_STARVING(rq)))
+		array = rq->expired;
+	enqueue_task(p, array);
 	rq->nr_running++;
 }
 
@@ -2461,22 +2480,6 @@
 }
 
 /*
- * We place interactive tasks back into the active array, if possible.
- *
- * To guarantee that this does not starve expired tasks we ignore the
- * interactivity of a task if the first expired task had to wait more
- * than a 'reasonable' amount of time. This deadline timeout is
- * load-dependent, as the frequency of array switched decreases with
- * increasing number of running tasks. We also ignore the interactivity
- * if a better static_prio task has expired:
- */
-#define EXPIRED_STARVING(rq) \
-	((STARVATION_LIMIT && ((rq)->expired_timestamp && \
-		(jiffies - (rq)->expired_timestamp >= \
-			STARVATION_LIMIT * ((rq)->nr_running) + 1))) || \
-			((rq)->curr->static_prio > (rq)->best_expired_prio))
-
-/*
  * Account user cpu time to a process.
  * @p: the process that the cpu time gets accounted to
  * @hardirq_offset: the offset to subtract from hardirq_count()





to post comments


Copyright © 2006, Eklektix, Inc.
Comments and public postings are copyrighted by their creators.
Linux is a registered trademark of Linus Torvalds