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 <[email protected]>
--- 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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Stuff]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
[Linux Resources]