[patch][rfc] quell interactive feeding frenzy

From: Mike Galbraith
Date: Fri Apr 07 2006 - 05:37:57 EST


Greetings,

Problem: Wake-up -> cpu latency increases with the number of runnable
tasks, ergo adding this latency to sleep_avg becomes increasingly potent
as nr_running increases. This turns into a very nasty problem with as
few as 10 httpd tasks doing round robin scheduling. The result is that
you can only login with difficulty, and interactivity is nonexistent.

Solution: Restrict the amount of boost a task can receive from this
mechanism, and disable the mechanism entirely when load is high. As
always, there is a price for increasing fairness. In this case, the
price seems worth it. It bought me a usable 2.6 apache server.


Signed-off-by: Mike Galbraith <efault@xxxxxx>

--- linux-2.6.17-rc1/kernel/sched.c.org 2006-04-07 08:52:47.000000000 +0200
+++ linux-2.6.17-rc1/kernel/sched.c 2006-04-07 08:57:34.000000000 +0200
@@ -3012,14 +3012,20 @@ go_idle:
queue = array->queue + idx;
next = list_entry(queue->next, task_t, run_list);

- if (!rt_task(next) && interactive_sleep(next->sleep_type)) {
+ if (!rt_task(next) && interactive_sleep(next->sleep_type) &&
+ rq->nr_running < 1 + MAX_BONUS - CURRENT_BONUS(next)) {
unsigned long long delta = now - next->timestamp;
+ unsigned long max_delta;
if (unlikely((long long)(now - next->timestamp) < 0))
delta = 0;

if (next->sleep_type == SLEEP_INTERACTIVE)
delta = delta * (ON_RUNQUEUE_WEIGHT * 128 / 100) / 128;

+ max_delta = (1 + MAX_BONUS - CURRENT_BONUS(next)) * GRANULARITY;
+ max_delta = JIFFIES_TO_NS(max_delta);
+ if (delta > max_delta)
+ delta = max_delta;
array = next->array;
new_prio = recalc_task_prio(next, next->timestamp + delta);



-
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/