All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Zijlstra <peterz@infradead.org>
To: Venkatesh Pallipadi <venki@google.com>
Cc: Damien Wyart <damien.wyart@free.fr>,
	Chase Douglas <chase.douglas@canonical.com>,
	Ingo Molnar <mingo@elte.hu>,
	tmhikaru@gmail.com, Thomas Gleixner <tglx@linutronix.de>,
	linux-kernel@vger.kernel.org
Subject: Re: High CPU load when machine is idle (related to PROBLEM: Unusually high load average when idle in 2.6.35, 2.6.35.1 and later)
Date: Tue, 26 Oct 2010 14:44:34 +0200	[thread overview]
Message-ID: <1288097074.15336.211.camel@twins> (raw)
In-Reply-To: <1288001573.15336.52.camel@twins>

On Mon, 2010-10-25 at 12:12 +0200, Peter Zijlstra wrote:
> On Fri, 2010-10-22 at 16:03 -0700, Venkatesh Pallipadi wrote:
> > I started making small changes to the code, but none of the change helped much.
> > I think the problem with the current code is that, even though idle CPUs
> > update load, the fold only happens when one of the CPU is busy
> > and we end up taking its load into global load.
> > 
> > So, I tried to simplify things and doing the updates directly from idle loop.
> > This is only a test patch, and eventually we need to hook it off somewhere
> > else, instead of idle loop and also this is expected work only as x86_64
> > right now.
> > 
> > Peter: Do you think something like this will work? loadavg went
> > quite on two of my test systems after this change (4 cpu and 24 cpu).
> 
> Not really, CPUs can stay idle for _very_ long times (!x86 cpus that
> don't have crappy timers like HPET which roll around every 2-4 seconds).
> 
> But all CPUs staying idle for a long time is exactly the scenario you
> fix before using the decay_load_misses() stuff, except that is for the
> load-balancer per-cpu load numbers not the global cpu load avg. Won't a
> similar approach work here?


The crude patch would be something like the below.. a smarter patch will
try and avoid that loop.

---
 include/linux/sched.h |    2 +-
 kernel/sched.c        |   20 +++++++++-----------
 kernel/timer.c        |    2 +-
 3 files changed, 11 insertions(+), 13 deletions(-)

diff --git a/include/linux/sched.h b/include/linux/sched.h
index 7a6e81f..84c1bf1 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -143,7 +143,7 @@ extern unsigned long nr_iowait_cpu(int cpu);
 extern unsigned long this_cpu_load(void);
 
 
-extern void calc_global_load(void);
+extern void calc_global_load(int ticks);
 
 extern unsigned long get_parent_ip(unsigned long addr);
 
diff --git a/kernel/sched.c b/kernel/sched.c
index 41f1869..49a2baf 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -3171,22 +3171,20 @@ calc_load(unsigned long load, unsigned long exp, unsigned long active)
  * calc_load - update the avenrun load estimates 10 ticks after the
  * CPUs have updated calc_load_tasks.
  */
-void calc_global_load(void)
+void calc_global_load(int ticks)
 {
-	unsigned long upd = calc_load_update + 10;
 	long active;
 
-	if (time_before(jiffies, upd))
-		return;
-
-	active = atomic_long_read(&calc_load_tasks);
-	active = active > 0 ? active * FIXED_1 : 0;
+	while (!time_before(jiffies, calc_load_update + 10)) {
+		active = atomic_long_read(&calc_load_tasks);
+		active = active > 0 ? active * FIXED_1 : 0;
 
-	avenrun[0] = calc_load(avenrun[0], EXP_1, active);
-	avenrun[1] = calc_load(avenrun[1], EXP_5, active);
-	avenrun[2] = calc_load(avenrun[2], EXP_15, active);
+		avenrun[0] = calc_load(avenrun[0], EXP_1, active);
+		avenrun[1] = calc_load(avenrun[1], EXP_5, active);
+		avenrun[2] = calc_load(avenrun[2], EXP_15, active);
 
-	calc_load_update += LOAD_FREQ;
+		calc_load_update += LOAD_FREQ;
+	}
 }
 
 /*
diff --git a/kernel/timer.c b/kernel/timer.c
index d6ccb90..9f82b2a 100644
--- a/kernel/timer.c
+++ b/kernel/timer.c
@@ -1297,7 +1297,7 @@ void do_timer(unsigned long ticks)
 {
 	jiffies_64 += ticks;
 	update_wall_time();
-	calc_global_load();
+	calc_global_load(ticks);
 }
 
 #ifdef __ARCH_WANT_SYS_ALARM


  parent reply	other threads:[~2010-10-26 12:44 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-09-29  7:01 High CPU load when machine is idle Damien Wyart
2010-10-14 14:58 ` High CPU load when machine is idle (related to PROBLEM: Unusually high load average when idle in 2.6.35, 2.6.35.1 and later) Damien Wyart
2010-10-14 15:29   ` Chase Douglas
2010-10-14 15:56     ` Damien Wyart
2010-10-15 11:08   ` Peter Zijlstra
2010-10-18 12:32     ` Peter Zijlstra
2010-10-20 13:27   ` Damien Wyart
2010-10-20 13:30     ` Peter Zijlstra
2010-10-20 13:43       ` Peter Zijlstra
2010-10-20 14:14         ` Peter Zijlstra
2010-10-20 14:25           ` Peter Zijlstra
2010-10-20 17:26           ` Peter Zijlstra
2010-10-20 20:24             ` Damien Wyart
2010-10-21  1:48             ` tmhikaru
2010-10-21  1:53               ` tmhikaru
2010-10-21  8:22                 ` Ingo Molnar
2010-10-21  8:57                   ` tmhikaru
2010-10-21 18:36               ` tmhikaru
2010-10-22  1:37                 ` tmhikaru
2010-10-21 12:09             ` Peter Zijlstra
2010-10-21 17:18               ` Venkatesh Pallipadi
2010-10-22 21:03                 ` Venkatesh Pallipadi
2010-10-22 23:03                 ` High CPU load when machine is idle (related to PROBLEM: Unusually high load average when idle in 2.6.35, 2.6.35.1 and later) Venkatesh Pallipadi
2010-10-23  2:13                   ` tmhikaru
2010-10-25 10:12                   ` Peter Zijlstra
2010-10-25 16:29                     ` Venkatesh Pallipadi
2010-10-26 12:44                     ` Peter Zijlstra [this message]
2010-10-26 14:05                       ` Peter Zijlstra
2010-10-29 19:42                         ` Peter Zijlstra
2010-11-09 18:55                           ` Kyle McMartin
2010-11-09 19:02                             ` Peter Zijlstra
2010-11-10  2:37                               ` tmhikaru
2010-11-10 12:01                                 ` Peter Zijlstra
2010-11-10  3:45                               ` Kyle McMartin
2010-11-10 12:00                                 ` Peter Zijlstra
2010-11-14  5:14                                   ` tmhikaru
2010-11-25 13:31                                     ` Damien Wyart
2010-11-25 14:03                                       ` Peter Zijlstra
2010-11-27 20:15                                         ` Peter Zijlstra
2010-11-28  4:26                                           ` Kyle McMartin
2010-11-28 11:40                                           ` Damien Wyart
2010-11-28 18:07                                             ` Valdis.Kletnieks
2010-11-29 11:38                                             ` Peter Zijlstra
2010-11-29 19:40                                               ` tmhikaru
2010-11-29 23:01                                                 ` Peter Zijlstra
2010-11-30 14:59                                                   ` Peter Zijlstra
2010-11-30 15:39                                                     ` Kyle McMartin
2010-11-30 20:04                                                       ` Kyle McMartin
2010-11-30 16:53                                                     ` Damien Wyart
2010-11-30 17:29                                                       ` Peter Zijlstra
2010-12-01 21:27                                                     ` tmhikaru
2010-12-02 10:16                                                       ` tmhikaru
2010-12-08 20:40                                                     ` [tip:sched/urgent] sched: Cure more NO_HZ load average woes tip-bot for Peter Zijlstra
2010-11-30 20:01                                                   ` High CPU load when machine is idle (related to PROBLEM: Unusually high load average when idle in 2.6.35, 2.6.35.1 and later) tmhikaru
2010-11-30 16:49                                               ` Damien Wyart

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=1288097074.15336.211.camel@twins \
    --to=peterz@infradead.org \
    --cc=chase.douglas@canonical.com \
    --cc=damien.wyart@free.fr \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=tglx@linutronix.de \
    --cc=tmhikaru@gmail.com \
    --cc=venki@google.com \
    /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.