From: Shilpasri G Bhat <shilpa.bhat@linux.vnet.ibm.com>
To: linux-kernel@vger.kernel.org
Cc: linux-pm@vger.kernel.org, mturquette@linaro.org,
amit.kucheria@linaro.org, vincent.guittot@linaro.org,
daniel.lezcano@linaro.org, Morten.Rasmussen@arm.com,
efault@gmx.de, nicolas.pitre@linaro.org,
dietmar.eggemann@arm.com, pjt@google.com, bsegall@google.com,
peterz@infradead.org, mingo@kernel.org,
linaro-kernel@lists.linaro.org,
Preeti U Murthy <preeti@linux.vnet.ibm.com>
Subject: Re: [RFC 0/2] CPU frequency scaled from a task's load on an idle wakeup
Date: Mon, 10 Nov 2014 14:49:29 +0530 [thread overview]
Message-ID: <54608321.5080602@linux.vnet.ibm.com> (raw)
In-Reply-To: <1415598358-26505-1-git-send-email-shilpa.bhat@linux.vnet.ibm.com>
Experimental Results:
Tested on a powerpc machine with 16 cores and obtained following results with
patchset.
I ran a modified version of ebizzy called sleeping-ebizzy which runs ebizzy at
various levels of utilization. The following results were found by running
ebizzy with 1 thread for 30s.
Utilization(%) Difference(%) in records/s with patch
-------------- -------------------------------------
10 -0.5516335445
20 +0.0196049675
30 +0.2222333684
40 +0.3205441843
50 -0.0103332452
60 -0.3525380134
70 +0.428654342
80 +0.1527132862
90 +0.0758061406
Thanks and Regards,
Shilpa
On 11/10/2014 11:15 AM, Shilpasri G Bhat wrote:
> This patch set aims to solve a problem in cpufreq governor's CPU
> load calculation logic when the CPU wakes up after an idle period.
> In the current logic when a CPU wakes up from an idle state the
> 'previous load' of the CPU is used as its current load on the
> alternate wakeups.
>
> A latency-sensitive-bursty task will be benefited from this logic if
> it wakes up on a CPU on which it was initially running, with a
> non-compromised CPU 'previous load' i.e, the 'previous load' holds
> the last calculated CPU load before the task went to sleep. In such
> a case, the cpufreq governor will account to high previous CPU load
> and decides to run at high frequency.
>
> The problem in this logic is that the 'previous load' which is meant
> to help certain latency-sensitive-bursty tasks can get used by some
> periodic-small tasks(like kernel daemons) to its advantage if the
> small task woke up first on the CPU. This will deprive the the
> latency-sensitive-bursty tasks from running at high frequency until
> the cpufreq governor notices the 100% CPU utilization. If this pattern
> gets repeated in the due course of bursty task's execution we will
> land on the same problem which 'prev_load' had originally set forth to
> solve.
>
> Probably we could reduce these inefficiencies if the cpufreq
> governor was aware of the task's nature, while calculating the load
> during an idle-wakeup scenario. So instead of using the previous
> load for the CPU , the load can be deduced on the basis of incoming
> task's load.
>
> In this patch we use a metric built on top of 'load_avg_contrib'.
> 'load_avg_contrib' of a task's sched entity can describe the nature
> of the task in terms of its CPU utilization. The properties of this
> metric to encapsulate the CPU utilization of a task makes it a
> potential candidate for scaling CPU frequency. However, due to the
> nature of its design 'load_avg_contrib' cannot pick up the task's
> load rapidly after a wakeup. As we are trying to solve the problem
> on idle-wakeup case we cannot use this metric value as is to scale
> the frequency. So we measure the cumulative moving average of
> 'load_avg_contrib'.
>
> The cumulative average of 'load_avg_contrib' at a given point is the
> average of all the values of 'load_avg_contrib' up until that point.
> The current average of a new 'load_avg_contrib' value is as below:
>
> Cumulative_average(n+1) = x(n+1) + Cumulative_average(n) * n
> ---------------------------------------
> n+1
> where,
> Cumulative_average(n+1) is the current cumulative average
> x(n+1) is the latest 'load_avg_contrib' value
> Cumulative_average(n) is the previous cumulative average
> n+1 is the number of 'load_avg_contrib' values so far
>
> The cumulative average of 'load_avg_contrib' will help us smooth out
> the short-term fluctuations and highlight long-term trend of
> 'load-avg_contrib' metric. So cumulative average of the task can
> depict the nature of the task more effectively. Thus we can scale CPU
> frequency based on the cumulative average of the task and make
> calculative decisions whether to decrease or increase the frequency
> depending on the nature of the task.
>
> Shilpasri G Bhat (2):
> sched/fair: Add cumulative average of load_avg_contrib to a task
> cpufreq: governor: CPU frequency scaled from task's cumulative-load on
> an idle wakeup
>
> drivers/cpufreq/cpufreq_governor.c | 39 +++++++++++++++-----------------------
> drivers/cpufreq/cpufreq_governor.h | 9 ++-------
> include/linux/sched.h | 4 ++++
> kernel/sched/core.c | 35 ++++++++++++++++++++++++++++++++++
> kernel/sched/fair.c | 6 +++++-
> kernel/sched/sched.h | 2 +-
> 6 files changed, 62 insertions(+), 33 deletions(-)
>
prev parent reply other threads:[~2014-11-10 9:19 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-10 5:45 [RFC 0/2] CPU frequency scaled from a task's load on an idle wakeup Shilpasri G Bhat
2014-11-10 5:45 ` [RFC 1/2] sched/fair: Add cumulative average of load_avg_contrib to a task Shilpasri G Bhat
2014-11-10 13:49 ` Peter Zijlstra
2014-11-11 14:52 ` Shilpasri G Bhat
2014-11-11 17:29 ` Peter Zijlstra
2014-11-11 17:30 ` Peter Zijlstra
2014-11-10 5:45 ` [RFC 2/2] cpufreq: governor: CPU frequency scaled from task's cumulative-load on an idle wakeup Shilpasri G Bhat
2014-11-10 9:19 ` Shilpasri G Bhat [this message]
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=54608321.5080602@linux.vnet.ibm.com \
--to=shilpa.bhat@linux.vnet.ibm.com \
--cc=Morten.Rasmussen@arm.com \
--cc=amit.kucheria@linaro.org \
--cc=bsegall@google.com \
--cc=daniel.lezcano@linaro.org \
--cc=dietmar.eggemann@arm.com \
--cc=efault@gmx.de \
--cc=linaro-kernel@lists.linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=mturquette@linaro.org \
--cc=nicolas.pitre@linaro.org \
--cc=peterz@infradead.org \
--cc=pjt@google.com \
--cc=preeti@linux.vnet.ibm.com \
--cc=vincent.guittot@linaro.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;
as well as URLs for NNTP newsgroup(s).