linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Venkatesh Pallipadi <venki@google.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: Ingo Molnar <mingo@elte.hu>,
	linux-kernel@vger.kernel.org, Ken Chen <kenchen@google.com>,
	Paul Turner <pjt@google.com>, Nikhil Rao <ncrao@google.com>,
	Suresh Siddha <suresh.b.siddha@intel.com>
Subject: Re: [PATCH] sched: Avoid side-effect of tickless idle on  update_cpu_load (v2)
Date: Mon, 17 May 2010 09:52:15 -0700	[thread overview]
Message-ID: <AANLkTikWWEYpwmqhQ0oYz30SUFY-y2erqStw2T6h0WXg@mail.gmail.com> (raw)
In-Reply-To: <1274084399.5605.3655.camel@twins>

On Mon, May 17, 2010 at 1:19 AM, Peter Zijlstra <peterz@infradead.org> wrote:
> On Fri, 2010-05-14 at 18:21 -0700, Venkatesh Pallipadi wrote:
>
>
>>  /*
>> + * The exact cpu_load decay at various idx values would be
>> + * [0] new = 0 * old + 1 * new
>> + * [1] new = 1/2 * old + 1/2 * new
>> + * [2] new = 3/4 * old + 1/4 * new
>> + * [3] new = 7/8 * old + 1/8 * new
>> + * [4] new = 15/16 * old + 1/16 * new
>
> Would that be something like?
>
>  load_i = ((2^i)-1)/(2^i) * load_i + 1/(2^i) * load_(i-1)
>
> Where load_-1 == current load.

Yes.

>> + * Load degrade calculations below are approximated on a 128 point scale.
>> + * degrade_zero_ticks is the number of ticks after which old_load at any
>> + * particular idx is approximated to be zero.
>> + * degrade_factor is a precomputed table, a row for each load idx.
>> + * Each column corresponds to degradation factor for a power of two ticks,
>> + * based on 128 point scale.
>> + * Example:
>> + * row 2, col 3 (=12) says that the degradation at load idx 2 after
>> + * 8 ticks is 12/128 (which is an approximation of exact factor 3^8/4^8).
>
> So because we're in no_hz, current load == 0 and we could approximate
> the thing by:
>
>  load_i = ((2^i)-1)/(2^i) * load_i
>
> Because for i ~ 1, there is no new input, and for i >> 1 the fraction is
> small.

Something like that. But, with total_updates = n and missed_updates = n - 1
We do this for (n - 1)
load_i = ((2^i)-1)/(2^i) * load_i
And do this once.
load_i = ((2^i)-1)/(2^i) * load_i + 1/(2^i) * cur_load

That way we do not differentiate between whether we are in tickless or
not and we use the same code path.

> But why then do we precalculate these factors? It seems to me
> ((2^i)-1)/(2^i) is something that is trivial to compute and doesn't
> warrant a lookup table?
>

Yes. Initially I had a for loop running for missed_updates to calculate
 ((2^i)-1)/(2^i) * load_i
in a loop.
But, it did seem sub-optimal. Specifically, if we have 10's of missed
ticks (which seems to be happening under low utilization), we do this
loop tens of times, just to degrade the load. And we do this on
multiple of the idle CPUs.
Using the look up table allows us to reduce the overhead (in terms of
missed ticks) from n to log_n or lower (as we look at only 1 bits in
missed_ticks).

Thanks,
Venki

  reply	other threads:[~2010-05-17 16:52 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-05-15  1:21 [PATCH] sched: Avoid side-effect of tickless idle on update_cpu_load (v2) Venkatesh Pallipadi
2010-05-17  8:19 ` Peter Zijlstra
2010-05-17 16:52   ` Venkatesh Pallipadi [this message]
2010-05-17 17:35     ` Peter Zijlstra
2010-05-17 17:52       ` Venkatesh Pallipadi
2010-05-18  1:14         ` Venkatesh Pallipadi
2010-05-18 15:20           ` Peter Zijlstra
2010-05-18 16:04             ` Venkatesh Pallipadi
2010-05-21 11:27           ` [tip:sched/urgent] sched: Avoid side-effect of tickless idle on update_cpu_load tip-bot for Venkatesh Pallipadi
2010-05-21 17:03             ` Ingo Molnar
2010-05-21 17:09               ` Peter Zijlstra
2010-05-21 18:18                 ` Venkatesh Pallipadi
2010-06-09 10:13           ` [tip:sched/core] " tip-bot for Venkatesh Pallipadi
2010-05-18 15:12         ` [PATCH] sched: Avoid side-effect of tickless idle on update_cpu_load (v2) 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=AANLkTikWWEYpwmqhQ0oYz30SUFY-y2erqStw2T6h0WXg@mail.gmail.com \
    --to=venki@google.com \
    --cc=kenchen@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=ncrao@google.com \
    --cc=peterz@infradead.org \
    --cc=pjt@google.com \
    --cc=suresh.b.siddha@intel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).