Re: interactive task starvation

From: Mike Galbraith
Date: Fri Mar 17 2006 - 12:11:08 EST


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 unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/