From: Ingo Molnar <mingo@elte.hu>
To: Nick Piggin <nickpiggin@yahoo.com.au>
Cc: Con Kolivas <kernel@kolivas.org>, Andrew Morton <akpm@osdl.org>,
linux-kernel@vger.kernel.org
Subject: Re: 2.6.8-rc2-mm2
Date: Wed, 4 Aug 2004 12:31:43 +0200 [thread overview]
Message-ID: <20040804103143.GA13072@elte.hu> (raw)
In-Reply-To: <41109FCC.4070906@yahoo.com.au>
[-- Attachment #1: Type: text/plain, Size: 1117 bytes --]
* Nick Piggin <nickpiggin@yahoo.com.au> wrote:
> Also, basic interactivity in X is bad with the interactive sysctl set
> to 0 (is X supposed to be at nice 0?), however fairness is bad when
> interactive is 1. I'm not sure if this is an acceptable tradeoff - are
> you planning to fix it?
it also has clear interactivity problems when just running lots of CPU
hogs even with the default interactive=1 compute=0 setting.
> Increasing priority (negative nice) doesn't have much impact. -20 CPU
> hog only gets about double the CPU of a 0 priority CPU hog and only
> about 120% the CPU time of a nice -10 hog.
this is a property of the base scheduler as well.
We can do a nonlinear timeslice distribution trivially - the attached
patch implements the following timeslice distribution ontop of
2.6.8-rc3:
[ -20 ... 0 ... 19 ] => [800ms ... 100ms ... 5ms]
the patch also cleans up some other aspects of timeslice calculations -
with it applied nice +19 tasks will get 20 times less CPU time than
default tasks. Previously it was 1:10.
the nice-20/nice+19 ratio is now 1:160 - sufficient for all aspects.
Ingo
[-- Attachment #2: sched-2.6.8-rc2-mm2-A2 --]
[-- Type: text/plain, Size: 3339 bytes --]
--- linux/kernel/sched.c.orig
+++ linux/kernel/sched.c
@@ -68,8 +68,6 @@
#define USER_PRIO(p) ((p)-MAX_RT_PRIO)
#define TASK_USER_PRIO(p) USER_PRIO((p)->static_prio)
#define MAX_USER_PRIO (USER_PRIO(MAX_PRIO))
-#define AVG_TIMESLICE (MIN_TIMESLICE + ((MAX_TIMESLICE - MIN_TIMESLICE) *\
- (MAX_PRIO-1-NICE_TO_PRIO(0))/(MAX_USER_PRIO - 1)))
/*
* Some helpers for converting nanosecond timing to jiffy resolution
@@ -80,12 +78,12 @@
/*
* These are the 'tuning knobs' of the scheduler:
*
- * Minimum timeslice is 10 msecs, default timeslice is 100 msecs,
- * maximum timeslice is 200 msecs. Timeslices get refilled after
- * they expire.
+ * Minimum timeslice is 5 msecs (or 1 jiffy, whichever is larger),
+ * default timeslice is 100 msecs, maximum timeslice is 800 msecs.
+ * Timeslices get refilled after they expire.
*/
-#define MIN_TIMESLICE ( 10 * HZ / 1000)
-#define MAX_TIMESLICE (200 * HZ / 1000)
+#define MIN_TIMESLICE max(5 * HZ / 1000, 1)
+#define DEF_TIMESLICE (100 * HZ / 1000)
#define ON_RUNQUEUE_WEIGHT 30
#define CHILD_PENALTY 95
#define PARENT_PENALTY 100
@@ -93,7 +91,7 @@
#define PRIO_BONUS_RATIO 25
#define MAX_BONUS (MAX_USER_PRIO * PRIO_BONUS_RATIO / 100)
#define INTERACTIVE_DELTA 2
-#define MAX_SLEEP_AVG (AVG_TIMESLICE * MAX_BONUS)
+#define MAX_SLEEP_AVG (DEF_TIMESLICE * MAX_BONUS)
#define STARVATION_LIMIT (MAX_SLEEP_AVG)
#define NS_MAX_SLEEP_AVG (JIFFIES_TO_NS(MAX_SLEEP_AVG))
#define CREDIT_LIMIT 100
@@ -162,23 +160,23 @@
((p)->prio < (rq)->curr->prio)
/*
- * BASE_TIMESLICE scales user-nice values [ -20 ... 19 ]
- * to time slice values.
+ * task_timeslice() scales user-nice values [ -20 ... 0 ... 19 ]
+ * to time slice values: [800ms ... 100ms ... 5ms]
*
* The higher a thread's priority, the bigger timeslices
* it gets during one round of execution. But even the lowest
* priority thread gets MIN_TIMESLICE worth of execution time.
- *
- * task_timeslice() is the interface that is used by the scheduler.
*/
-#define BASE_TIMESLICE(p) (MIN_TIMESLICE + \
- ((MAX_TIMESLICE - MIN_TIMESLICE) * \
- (MAX_PRIO-1 - (p)->static_prio) / (MAX_USER_PRIO-1)))
+#define SCALE_PRIO(x, prio) \
+ max(x * (MAX_PRIO - prio) / (MAX_USER_PRIO/2), MIN_TIMESLICE)
static unsigned int task_timeslice(task_t *p)
{
- return BASE_TIMESLICE(p);
+ if (p->static_prio < NICE_TO_PRIO(0))
+ return SCALE_PRIO(DEF_TIMESLICE*4, p->static_prio);
+ else
+ return SCALE_PRIO(DEF_TIMESLICE, p->static_prio);
}
#define task_hot(p, now, sd) ((now) - (p)->timestamp < (sd)->cache_hot_time)
@@ -400,7 +398,7 @@ static void recalc_task_prio(task_t *p,
if (p->mm && p->activated != -1 &&
sleep_time > INTERACTIVE_SLEEP(p)) {
p->sleep_avg = JIFFIES_TO_NS(MAX_SLEEP_AVG -
- AVG_TIMESLICE);
+ DEF_TIMESLICE);
if (!HIGH_CREDIT(p))
p->interactive_credit++;
} else {
@@ -1024,8 +1022,8 @@ void fastcall sched_exit(task_t * p)
rq = task_rq_lock(p->parent, &flags);
if (p->first_time_slice) {
p->parent->time_slice += p->time_slice;
- if (unlikely(p->parent->time_slice > MAX_TIMESLICE))
- p->parent->time_slice = MAX_TIMESLICE;
+ if (unlikely(p->parent->time_slice > task_timeslice(p)))
+ p->parent->time_slice = task_timeslice(p);
}
if (p->sleep_avg < p->parent->sleep_avg)
p->parent->sleep_avg = p->parent->sleep_avg /
next prev parent reply other threads:[~2004-08-04 10:37 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-08-02 8:55 2.6.8-rc2-mm2 Andrew Morton
2004-08-02 9:23 ` 2.6.8-rc2-mm2 Espen Fjellvær Olsen
2004-08-02 12:10 ` 2.6.8-rc2-mm2 Rik van Riel
2004-08-05 10:56 ` 2.6.8-rc2-mm2 Hideo AOKI
2004-08-05 12:55 ` 2.6.8-rc2-mm2 Hideo AOKI
2004-08-02 13:07 ` 2.6.8-rc2-mm2 Con Kolivas
2004-08-03 6:43 ` 2.6.8-rc2-mm2 Nick Piggin
2004-08-03 7:35 ` 2.6.8-rc2-mm2 Con Kolivas
2004-08-03 7:43 ` 2.6.8-rc2-mm2 Nick Piggin
2004-08-03 7:45 ` 2.6.8-rc2-mm2 Con Kolivas
2004-08-04 8:35 ` 2.6.8-rc2-mm2 Nick Piggin
2004-08-04 10:12 ` 2.6.8-rc2-mm2 Con Kolivas
2004-08-04 10:33 ` 2.6.8-rc2-mm2 Nick Piggin
2004-08-04 11:42 ` 2.6.8-rc2-mm2 bert hubert
2004-08-05 1:21 ` 2.6.8-rc2-mm2 Nick Piggin
2004-08-04 10:31 ` Ingo Molnar [this message]
2004-08-04 10:46 ` 2.6.8-rc2-mm2 Nick Piggin
2004-08-04 10:47 ` 2.6.8-rc2-mm2 Con Kolivas
2004-08-04 12:45 ` 2.6.8-rc2-mm2 Ingo Molnar
2004-08-05 2:53 ` 2.6.8-rc2-mm2 Con Kolivas
2004-08-05 8:34 ` 2.6.8-rc2-mm2 Helge Hafting
2004-08-05 9:34 ` 2.6.8-rc2-mm2 Con Kolivas
2004-08-05 10:47 ` 2.6.8-rc2-mm2 Ingo Molnar
2004-08-02 13:52 ` 2.6.8-rc2-mm2 William Lee Irwin III
2004-08-02 16:12 ` 2.6.8-rc2-mm2 William Lee Irwin III
2004-08-02 14:28 ` 2.6.8-rc2-mm2 William Lee Irwin III
2004-08-02 15:31 ` 2.6.8-rc2-mm2 Mark Watts
2004-08-02 15:33 ` 2.6.8-rc2-mm2 Jesper Juhl
2004-08-02 15:38 ` 2.6.8-rc2-mm2 Dominik Karall
2004-08-02 16:02 ` 2.6.8-rc2-mm2 Mark Watts
2004-08-03 6:55 ` 2.6.8-rc2-mm2 Clemens Schwaighofer
2004-08-02 15:57 ` 2.6.8-rc2-mm2 Martin Zwickel
2004-08-02 17:59 ` 2.6.8-rc2-mm2 (compile stats) John Cherry
2004-08-02 18:15 ` 2.6.8-rc2-mm2 Peter Osterlund
2004-08-02 22:16 ` [patch] 2.6.8-rc2-mm2: compile error with SWAP=n Adrian Bunk
2004-08-03 8:27 ` 2.6.8-rc2-mm2 Mark Watts
2004-08-03 13:05 ` 2.6.8-rc2-mm2 R. J. Wysocki
2004-08-03 13:13 ` 2.6.8-rc2-mm2 Con Kolivas
2004-08-03 19:44 ` 2.6.8-rc2-mm2 Adrian Bunk
2004-08-04 16:32 ` 2.6.8-rc2-mm2 Dominik Karall
2004-08-05 4:38 ` [sparc32] [1/13] turbosparc flush warnings William Lee Irwin III
2004-08-05 4:39 ` [sparc32] [2/13] sparc32 init_idle() William Lee Irwin III
2004-08-05 4:41 ` [sparc32] [3/13] sun4d cpu_present_map is a cpumask_t William Lee Irwin III
2004-08-05 4:44 ` [sparc32] [4/13] smp_processor_id() BITFIXUP fixes William Lee Irwin III
2004-08-05 4:46 ` [sparc32] [5/13] reinstate smp_reschedule_irq() William Lee Irwin III
2004-08-05 4:47 ` [sparc32] [6/13] remove references to start_secondary() William Lee Irwin III
2004-08-05 4:48 ` [sparc32] [7/13] remove references to num_context_patch2 William Lee Irwin III
2004-08-05 4:49 ` [sparc32] [8/13] define cache_decay_ticks William Lee Irwin III
2004-08-05 4:54 ` [sparc32] [9/13] remove unused variable in dvma.c William Lee Irwin III
2004-08-05 4:55 ` [sparc32] [10/13] sun4 does not support SMP William Lee Irwin III
2004-08-05 4:56 ` [sparc32] [11/13] make CONFIG_SMP depend on CONFIG_BROKEN William Lee Irwin III
2004-08-05 5:01 ` [sparc32] [12/13] gcc-3.3 macro parenthesization fix for memcpy.S William Lee Irwin III
2004-08-05 5:31 ` [sparc32] [13/13] ignore undefined symbols with 3 or more leading underscores William Lee Irwin III
2004-08-05 7:28 ` [sparc32] [12/13] gcc-3.3 macro parenthesization fix for memcpy.S Jakub Jelinek
2004-08-05 7:38 ` William Lee Irwin III
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20040804103143.GA13072@elte.hu \
--to=mingo@elte.hu \
--cc=akpm@osdl.org \
--cc=kernel@kolivas.org \
--cc=linux-kernel@vger.kernel.org \
--cc=nickpiggin@yahoo.com.au \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.