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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox