From: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
To: LKML <linux-kernel@vger.kernel.org>,
Peter Zijlstra <peterz@infradead.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
Andrew Morton <akpm@linux-foundation.org>,
Ingo Molnar <mingo@elte.hu>, Steven Rostedt <rostedt@goodmis.org>,
Thomas Gleixner <tglx@linutronix.de>,
Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
Tony Lindgren <tony@atomide.com>, Mike Galbraith <efault@gmx.de>
Subject: [RFC patch 1/2] sched: dynamically adapt granularity with nr_running
Date: Sat, 11 Sep 2010 13:37:33 -0400 [thread overview]
Message-ID: <20100911174003.051303123@efficios.com> (raw)
In-Reply-To: 20100911173732.551632040@efficios.com
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: sched-small-spread.patch --]
[-- Type: text/plain, Size: 4838 bytes --]
Changing the minimum granularity is a double-edged sword: if we set it to a too
small value, then the scheduler will preempt tasks too often. If it is too
large, then the "latency" period can grow very large as the number of running
tasks increases.
This patch leaves the same scheduling granularity when there are few tasks on
the system (3 or less), but dynamically adapts (shrinks) the sched granularity
when there are more. At a ceiling value of 8 running tasks (this choice is
arbitrary), it grows the latency rather than shrinking granularity further to
ensure we don't end up calling the scheduler too often.
(on a uniprocessor 2.0 GHz Pentium M)
* Without the patch:
- wakeup-latency with SIGEV_THREAD in parallel with youtube video and
make -j10
maximum latency: 50107.8 µs
average latency: 6609.2 µs
missed timer events: 0
- wakeup-latency with SIGEV_SIGNAL in parallel with youtube video and
make -j10
maximum latency: 8608.3 µs
average latency: 101.3 µs
missed timer events: 0
* With the patch
- wakeup-latency with SIGEV_THREAD in parallel with youtube video and
make -j10
maximum latency: 26367.4 µs
average latency: 5382.6 µs
missed timer events: 0
- wakeup-latency with SIGEV_SIGNAL in parallel with youtube video and
make -j10
maximum latency: 3030.4 µs
average latency: 129.3 µs
missed timer events: 0
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
---
kernel/sched_debug.c | 1 +
kernel/sched_fair.c | 39 +++++++++++++++++++++++++++++----------
2 files changed, 30 insertions(+), 10 deletions(-)
Index: linux-2.6-lttng.git/kernel/sched_fair.c
===================================================================
--- linux-2.6-lttng.git.orig/kernel/sched_fair.c
+++ linux-2.6-lttng.git/kernel/sched_fair.c
@@ -51,16 +51,23 @@ enum sched_tunable_scaling sysctl_sched_
= SCHED_TUNABLESCALING_LOG;
/*
- * Minimal preemption granularity for CPU-bound tasks:
+ * Minimum preemption granularity (when number of tasks increases).
+ */
+unsigned int sysctl_sched_min_granularity = 750000ULL;
+unsigned int normalized_sysctl_sched_min_granularity = 750000ULL;
+
+/*
+ * Standard preemption granularity for CPU-bound tasks:
* (default: 2 msec * (1 + ilog(ncpus)), units: nanoseconds)
*/
-unsigned int sysctl_sched_min_granularity = 2000000ULL;
-unsigned int normalized_sysctl_sched_min_granularity = 2000000ULL;
+unsigned int sysctl_sched_std_granularity = 2000000ULL;
+unsigned int normalized_sysctl_sched_std_granularity = 2000000ULL;
/*
- * is kept at sysctl_sched_latency / sysctl_sched_min_granularity
+ * is kept at sysctl_sched_latency / sysctl_sched_std_granularity
*/
static unsigned int sched_nr_latency = 3;
+static unsigned int sched_nr_latency_max = 8;
/*
* After fork, child runs first. If set to 0 (default) then
@@ -439,24 +446,36 @@ calc_delta_fair(unsigned long delta, str
/*
* The idea is to set a period in which each task runs once.
*
- * When there are too many tasks (sysctl_sched_nr_latency) we have to stretch
- * this period because otherwise the slices get too small.
+ * When there are too many tasks (sysctl_sched_nr_latency) we have to shrink the
+ * slices, up to sysctl_sched_min_granularity.
*
* p = (nr <= nl) ? l : l*nr/nl
*/
static u64 __sched_period(unsigned long nr_running)
{
+ unsigned long nr_latency_max = sched_nr_latency_max;
u64 period = sysctl_sched_latency;
- unsigned long nr_latency = sched_nr_latency;
- if (unlikely(nr_running > nr_latency)) {
+ if (unlikely(nr_running > nr_latency_max)) {
period = sysctl_sched_min_granularity;
period *= nr_running;
}
-
return period;
}
+static unsigned int __sched_gran(unsigned long nr_running)
+{
+ unsigned int gran = sysctl_sched_std_granularity;
+ unsigned long nr_latency = sched_nr_latency;
+
+ if (unlikely(nr_running > nr_latency)) {
+ gran = sysctl_sched_latency;
+ gran /= nr_running;
+ gran = max(gran, sysctl_sched_min_granularity);
+ }
+ return gran;
+}
+
/*
* We calculate the wall-time slice from the period by taking a part
* proportional to the weight.
@@ -862,7 +881,7 @@ check_preempt_tick(struct cfs_rq *cfs_rq
if (!sched_feat(WAKEUP_PREEMPT))
return;
- if (delta_exec < sysctl_sched_min_granularity)
+ if (delta_exec < __sched_gran(cfs_rq->nr_running))
return;
if (cfs_rq->nr_running > 1) {
Index: linux-2.6-lttng.git/kernel/sched_debug.c
===================================================================
--- linux-2.6-lttng.git.orig/kernel/sched_debug.c
+++ linux-2.6-lttng.git/kernel/sched_debug.c
@@ -331,6 +331,7 @@ static int sched_debug_show(struct seq_f
P(jiffies);
PN(sysctl_sched_latency);
PN(sysctl_sched_min_granularity);
+ PN(sysctl_sched_std_granularity);
PN(sysctl_sched_wakeup_granularity);
PN(sysctl_sched_child_runs_first);
P(sysctl_sched_features);
next prev parent reply other threads:[~2010-09-11 17:40 UTC|newest]
Thread overview: 76+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-09-11 17:37 [RFC patch 0/2] sched: dynamically adapt granularity with nr_running Mathieu Desnoyers
2010-09-11 17:37 ` Mathieu Desnoyers [this message]
2010-09-11 18:57 ` [RFC patch 1/2] " Peter Zijlstra
2010-09-11 19:21 ` Linus Torvalds
2010-09-11 20:36 ` Peter Zijlstra
2010-09-11 20:45 ` Peter Zijlstra
2010-09-11 20:52 ` Linus Torvalds
2010-09-12 9:07 ` Peter Zijlstra
2010-09-11 20:48 ` Linus Torvalds
2010-09-12 9:06 ` Peter Zijlstra
2010-09-12 9:14 ` Peter Zijlstra
2010-09-12 20:39 ` Mathieu Desnoyers
2010-09-13 12:54 ` Peter Zijlstra
2010-09-12 20:34 ` Mathieu Desnoyers
2010-09-13 12:53 ` Peter Zijlstra
2010-09-13 4:35 ` Mike Galbraith
2010-09-13 8:41 ` Peter Zijlstra
2010-09-13 11:22 ` Ingo Molnar
2010-09-13 13:52 ` Steven Rostedt
2010-09-13 13:54 ` Peter Zijlstra
2010-09-13 14:02 ` Peter Zijlstra
2010-09-13 14:21 ` Ingo Molnar
2010-09-11 20:52 ` Mathieu Desnoyers
2010-09-11 19:57 ` Mathieu Desnoyers
2010-09-12 10:41 ` Peter Zijlstra
2010-09-12 20:37 ` Mathieu Desnoyers
2010-09-13 12:53 ` Peter Zijlstra
2010-09-13 13:15 ` Peter Zijlstra
2010-09-13 13:56 ` Mathieu Desnoyers
2010-09-13 14:16 ` Peter Zijlstra
2010-09-13 14:43 ` Steven Rostedt
2010-09-13 15:25 ` Mathieu Desnoyers
2010-09-13 15:39 ` Steven Rostedt
2010-09-13 16:16 ` [RFC PATCH] check_preempt_tick should not compare vruntime with wall time Mathieu Desnoyers
2010-09-13 16:36 ` Linus Torvalds
2010-09-13 17:45 ` Mathieu Desnoyers
2010-09-13 17:51 ` Linus Torvalds
2010-09-13 18:01 ` Mathieu Desnoyers
2010-09-13 18:10 ` Steven Rostedt
2010-09-13 18:03 ` Ingo Molnar
2010-09-13 18:19 ` Mathieu Desnoyers
2010-09-13 18:23 ` [PATCH] sched: Improve latencies under load by decreasing minimum scheduling granularity Ingo Molnar
2010-09-13 18:28 ` Joe Perches
2010-09-13 19:44 ` Linus Torvalds
2010-09-13 20:00 ` Ingo Molnar
2010-09-13 18:19 ` [RFC PATCH] check_preempt_tick should not compare vruntime with wall time Ingo Molnar
2010-09-13 17:36 ` Ingo Molnar
2010-09-13 17:56 ` Mathieu Desnoyers
2010-09-14 2:10 ` Mike Galbraith
2010-09-13 14:44 ` [RFC patch 1/2] sched: dynamically adapt granularity with nr_running Mike Galbraith
[not found] ` <1284386179.10436.6.camel@marge.simson.net>
2010-09-13 15:53 ` Peter Zijlstra
2010-09-13 18:04 ` [RFC][PATCH] sched: Improve tick preemption Peter Zijlstra
2010-09-14 2:27 ` [RFC patch 1/2] sched: dynamically adapt granularity with nr_running Mike Galbraith
2010-09-12 6:14 ` Ingo Molnar
2010-09-12 7:21 ` Mike Galbraith
2010-09-12 18:16 ` Mathieu Desnoyers
2010-09-13 4:13 ` Mike Galbraith
2010-09-13 6:41 ` Ingo Molnar
2010-09-13 7:08 ` Mike Galbraith
2010-09-13 7:35 ` Mike Galbraith
2010-09-13 8:35 ` Peter Zijlstra
2010-09-13 9:16 ` Mike Galbraith
2010-09-13 9:37 ` Peter Zijlstra
2010-09-13 9:50 ` Mike Galbraith
2010-09-13 9:55 ` Peter Zijlstra
2010-09-13 10:06 ` Mike Galbraith
2010-09-13 10:45 ` Peter Zijlstra
2010-09-13 11:43 ` Peter Zijlstra
2010-09-13 11:49 ` Peter Zijlstra
2010-09-13 12:32 ` Mike Galbraith
2010-09-13 20:19 ` Mathieu Desnoyers
2010-09-13 20:56 ` Mathieu Desnoyers
2010-09-12 18:13 ` Mathieu Desnoyers
2010-09-12 23:44 ` Mathieu Desnoyers
2010-09-11 17:37 ` [RFC patch 2/2] sched: sleepers coarse granularity on wakeup Mathieu Desnoyers
2010-09-12 12:44 ` [RFC patch 0/2] sched: dynamically adapt granularity with nr_running Peter Zijlstra
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=20100911174003.051303123@efficios.com \
--to=mathieu.desnoyers@efficios.com \
--cc=akpm@linux-foundation.org \
--cc=efault@gmx.de \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=tglx@linutronix.de \
--cc=tony@atomide.com \
--cc=torvalds@linux-foundation.org \
/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