mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Ricardo Neri <ricardo.neri-calderon@linux.intel.com>
To: Vincent Guittot <vincent.guittot@linaro.org>
Cc: "Peter Zijlstra (Intel)" <peterz@infradead.org>,
	Juri Lelli <juri.lelli@redhat.com>,
	Ricardo Neri <ricardo.neri@intel.com>,
	"Ravi V. Shankar" <ravi.v.shankar@intel.com>,
	Ben Segall <bsegall@google.com>,
	Daniel Bristot de Oliveira <bristot@redhat.com>,
	Dietmar Eggemann <dietmar.eggemann@arm.com>,
	Len Brown <len.brown@intel.com>, Mel Gorman <mgorman@suse.de>,
	"Rafael J. Wysocki" <rafael.j.wysocki@intel.com>,
	Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>,
	Steven Rostedt <rostedt@goodmis.org>,
	Tim Chen <tim.c.chen@linux.intel.com>,
	Valentin Schneider <vschneid@redhat.com>,
	Lukasz Luba <lukasz.luba@arm.com>,
	Ionela Voinescu <ionela.voinescu@arm.com>,
	x86@kernel.org,
	"Joel Fernandes (Google)" <joel@joelfernandes.org>,
	linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org,
	"Tim C . Chen" <tim.c.chen@intel.com>
Subject: Re: [PATCH v3 07/24] sched/fair: Compute IPC class scores for load balancing
Date: Wed, 29 Mar 2023 19:07:24 -0700	[thread overview]
Message-ID: <20230330020724.GA26315@ranerica-svr.sc.intel.com> (raw)
In-Reply-To: <CAKfTPtB_jZ6q0+9cWxjNZD9gLi-Ts_o_HfBZdiebZz89rHA6iw@mail.gmail.com>

On Tue, Mar 28, 2023 at 12:00:58PM +0200, Vincent Guittot wrote:
> On Tue, 7 Feb 2023 at 06:01, Ricardo Neri
> <ricardo.neri-calderon@linux.intel.com> wrote:
> >
> > Compute the joint total (both current and prospective) IPC class score of
> > a scheduling group and the local scheduling group.
> >
> > These IPCC statistics are used during idle load balancing. The candidate
> > scheduling group will have one fewer busy CPU after load balancing. This
> > observation is important for cores with SMT support.
> >
> > The IPCC score of scheduling groups composed of SMT siblings needs to
> > consider that the siblings share CPU resources. When computing the total
> > IPCC score of the scheduling group, divide score of each sibling by the
> > number of busy siblings.
> >
> > Collect IPCC statistics for asym_packing and fully_busy scheduling groups.
> 
> IPCC statistics collect scores of current tasks, so they are
> meaningful only when trying to migrate one of those running tasks.
> Using such score when pulling other tasks is just meaningless. And I
> don't see how you ensure such correct use of ipcc score

Thank you very much for your feedback Vincent!

It is true that the task that is current when collecting statistics may be
different from the task that is current when we are ready to pluck tasks.

Using IPCC scores for load balancing benefits large, long-running tasks
the most. For these tasks, the current task is likely to remain the same
at the two mentioned points in time.

My patchset proposes to use IPCC clases to break ties between otherwise
identical sched groups in update_sd_pick_busiest(). Its use is limited to
asym_packing and fully_busy types. For these types, it is likely that there
will not be tasks wanting to run other than current. need_active_balance()
will return true and we will migrate the current task.

You are correct, by only looking at the current tasks we risk overlooking
other tasks in the queue and the statistics becoming meaningless. A fully
correct solution would need to keep track of the the types of tasks in
all runqueues as they come and go. IMO, the increased complexity of such
approach does not justify the benefit. We give the load balancer extra
information to decide between otherwise identical sched groups using the
IPCC statistics of big tasks.

> 
> > When picking a busiest group, they are used to break ties between otherwise
> > identical groups.
> >
> > Cc: Ben Segall <bsegall@google.com>
> > Cc: Daniel Bristot de Oliveira <bristot@redhat.com>
> > Cc: Dietmar Eggemann <dietmar.eggemann@arm.com>
> > Cc: Ionela Voinescu <ionela.voinescu@arm.com>
> > Cc: Joel Fernandes (Google) <joel@joelfernandes.org>
> > Cc: Len Brown <len.brown@intel.com>
> > Cc: Lukasz Luba <lukasz.luba@arm.com>
> > Cc: Mel Gorman <mgorman@suse.de>
> > Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> > Cc: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
> > Cc: Steven Rostedt <rostedt@goodmis.org>
> > Cc: Tim C. Chen <tim.c.chen@intel.com>
> > Cc: Valentin Schneider <vschneid@redhat.com>
> > Cc: x86@kernel.org
> > Cc: linux-pm@vger.kernel.org
> > Cc: linux-kernel@vger.kernel.org
> > Signed-off-by: Ricardo Neri <ricardo.neri-calderon@linux.intel.com>
> > ---
> > Changes since v2:
> >  * Also collect IPCC stats for fully_busy sched groups.
> 
> Why have you added fully_busy case ? it's worth explaining the
> rational because there is a lot of change to use the ipcc score of the
> wrong task to take the decision

When deciding between two fully_busy sched groups, update_sd_pick_busiest()
unconditionally selects the given candidate @sg as busiest. With IPCC
scores, what is running a scheduling group becomes important. We now have
extra information to select either of the fully_busy groups. This is done
in patch 9.

(Also note that in [1] I tweak the logic to select fully_busy SMT cores vs
fully_busy non-SMT cores).

> 
> >  * Restrict use of IPCC stats to SD_ASYM_PACKING. (Ionela)
> >  * Handle errors of arch_get_ipcc_score(). (Ionela)
> >
> > Changes since v1:
> >  * Implemented cleanups and reworks from PeterZ. I took all his
> >    suggestions, except the computation of the  IPC score before and after
> >    load balancing. We are computing not the average score, but the *total*.
> >  * Check for the SD_SHARE_CPUCAPACITY to compute the throughput of the SMT
> >    siblings of a physical core.
> >  * Used the new interface names.
> >  * Reworded commit message for clarity.
> > ---
> >  kernel/sched/fair.c | 68 +++++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 68 insertions(+)
> >
> > diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
> > index d773380a95b3..b6165aa8a376 100644
> > --- a/kernel/sched/fair.c
> > +++ b/kernel/sched/fair.c
> > @@ -8901,6 +8901,8 @@ struct sg_lb_stats {
> >         unsigned long min_score; /* Min(score(rq->curr->ipcc)) */
> >         unsigned short min_ipcc; /* Class of the task with the minimum IPCC score in the rq */
> >         unsigned long sum_score; /* Sum(score(rq->curr->ipcc)) */
> > +       long ipcc_score_after; /* Prospective IPCC score after load balancing */
> > +       unsigned long ipcc_score_before; /* IPCC score before load balancing */
> >  #endif
> >  };
> >
> > @@ -9287,6 +9289,62 @@ static void update_sg_lb_ipcc_stats(int dst_cpu, struct sg_lb_stats *sgs,
> >         }
> >  }
> >
> > +static void update_sg_lb_stats_scores(struct sg_lb_stats *sgs,
> > +                                     struct sched_group *sg,
> > +                                     struct lb_env *env)
> > +{
> > +       unsigned long score_on_dst_cpu, before;
> > +       int busy_cpus;
> > +       long after;
> > +
> > +       if (!sched_ipcc_enabled())
> > +               return;
> > +
> > +       /*
> > +        * IPCC scores are only useful during idle load balancing. For now,
> > +        * only asym_packing uses IPCC scores.
> > +        */
> > +       if (!(env->sd->flags & SD_ASYM_PACKING) ||
> > +           env->idle == CPU_NOT_IDLE)
> > +               return;
> > +
> > +       /*
> > +        * IPCC scores are used to break ties only between these types of
> > +        * groups.
> > +        */
> > +       if (sgs->group_type != group_fully_busy &&
> > +           sgs->group_type != group_asym_packing)
> > +               return;
> > +
> > +       busy_cpus = sgs->group_weight - sgs->idle_cpus;
> > +
> > +       /* No busy CPUs in the group. No tasks to move. */
> > +       if (!busy_cpus)
> > +               return;
> > +
> > +       score_on_dst_cpu = arch_get_ipcc_score(sgs->min_ipcc, env->dst_cpu);
> > +
> > +       /*
> > +        * Do not use IPC scores. sgs::ipcc_score_{after, before} will be zero
> > +        * and not used.
> > +        */
> > +       if (IS_ERR_VALUE(score_on_dst_cpu))
> > +               return;
> > +
> > +       before = sgs->sum_score;
> > +       after = before - sgs->min_score;
> 
> IIUC, you assume that you will select the cpu with the min score.
> How do you ensure this ? otherwise all your comparisong are useless

This is relevant for SMT cores. A smaller idle core will help a fully_busy
SMT core by pulling low-IPC work, leaving the full core for high-IPC
work.

We ensure (or anticipate if you will) this because find_busiest_queue()
will select the queue whose current task gets the biggest IPC boost. When
done from big to small cores the IPC boost is negative.

> 
> > +
> > +       /* SMT siblings share throughput. */
> > +       if (busy_cpus > 1 && sg->flags & SD_SHARE_CPUCAPACITY) {
> > +               before /= busy_cpus;
> > +               /* One sibling will become idle after load balance. */
> > +               after /= busy_cpus - 1;
> > +       }
> > +
> > +       sgs->ipcc_score_after = after + score_on_dst_cpu;
> > +       sgs->ipcc_score_before = before;
> 
> I'm not sure to understand why you are computing the sum_score,
> ipcc_score_before and ipcc_score_after ?
> Why is it not sufficient to check if score_on_dst_cpu will be higher
> than current min_score ?

You are right. As the source core becomes idle after load balancing, it is
sufficient to look for the highest score_on_dst_cpu. However, we must also
handle SMT cores.

If the source sched group is a fully_busy SMT core, one of the siblings
will become idle after load balance (my patchset uses IPCC scores for
asym_packing and when balancing the number of idle CPUs from fully_busy).
The remaining non-idle siblings will benefit from the extra throughput.

We calculate ipcc_score_after to find the sched group that would benefit
the most. We calculate ipcc_score_before to break ties of two groups of
identical ipcc_score_after.

Thanks and BR,
Ricardo

[1]. https://lore.kernel.org/lkml/20230207045838.11243-6-ricardo.neri-calderon@linux.intel.com/

  reply	other threads:[~2023-03-30  1:56 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-02-07  5:10 [PATCH v3 00/24] sched: Introduce classes of tasks for load balance Ricardo Neri
2023-02-07  5:10 ` [PATCH v3 01/24] sched/task_struct: Introduce IPC classes of tasks Ricardo Neri
2023-02-07  5:10 ` [PATCH v3 02/24] sched: Add interfaces for IPC classes Ricardo Neri
2023-02-07  5:10 ` [PATCH v3 03/24] sched/core: Initialize the IPC class of a new task Ricardo Neri
2023-02-07  5:10 ` [PATCH v3 04/24] sched/core: Add user_tick as argument to scheduler_tick() Ricardo Neri
2023-02-07  5:10 ` [PATCH v3 05/24] sched/core: Update the IPC class of the current task Ricardo Neri
2023-02-07  5:10 ` [PATCH v3 06/24] sched/fair: Collect load-balancing stats for IPC classes Ricardo Neri
2023-02-07  5:10 ` [PATCH v3 07/24] sched/fair: Compute IPC class scores for load balancing Ricardo Neri
2023-03-28 10:00   ` Vincent Guittot
2023-03-30  2:07     ` Ricardo Neri [this message]
2023-03-31 12:20       ` Vincent Guittot
2023-04-17 22:52         ` Ricardo Neri
2023-02-07  5:10 ` [PATCH v3 08/24] sched/fair: Use IPCC stats to break ties between asym_packing sched groups Ricardo Neri
2023-02-07  5:10 ` [PATCH v3 09/24] sched/fair: Use IPCC stats to break ties between fully_busy SMT groups Ricardo Neri
2023-02-07  5:10 ` [PATCH v3 10/24] sched/fair: Use IPCC scores to select a busiest runqueue Ricardo Neri
2023-03-28 10:03   ` Vincent Guittot
2023-03-30  2:14     ` Ricardo Neri
2023-03-31 12:23       ` Vincent Guittot
2023-04-17 23:01         ` Ricardo Neri
2023-02-07  5:10 ` [PATCH v3 11/24] thermal: intel: hfi: Introduce Intel Thread Director classes Ricardo Neri
2023-03-27 16:31   ` Rafael J. Wysocki
2023-03-28 23:42     ` Ricardo Neri
2023-02-07  5:10 ` [PATCH v3 12/24] x86/cpufeatures: Add the Intel Thread Director feature definitions Ricardo Neri
2023-02-07  5:10 ` [PATCH v3 13/24] thermal: intel: hfi: Store per-CPU IPCC scores Ricardo Neri
2023-03-27 16:37   ` Rafael J. Wysocki
2023-03-28 23:43     ` Ricardo Neri
2023-03-29 12:08       ` Rafael J. Wysocki
2023-03-30  2:15         ` Ricardo Neri
2023-02-07  5:10 ` [PATCH v3 14/24] thermal: intel: hfi: Update the IPC class of the current task Ricardo Neri
2023-03-27 16:42   ` Rafael J. Wysocki
2023-03-28 23:41     ` Ricardo Neri
2023-03-29 12:13       ` Rafael J. Wysocki
2023-03-30  3:06         ` Ricardo Neri
2023-02-07  5:10 ` [PATCH v3 15/24] thermal: intel: hfi: Report the IPC class score of a CPU Ricardo Neri
2023-03-27 16:50   ` Rafael J. Wysocki
2023-03-28 23:41     ` Ricardo Neri
2023-03-29 12:17       ` Rafael J. Wysocki
2023-03-31  2:07         ` Ricardo Neri
2023-02-07  5:10 ` [PATCH v3 16/24] thermal: intel: hfi: Define a default class for unclassified tasks Ricardo Neri
2023-03-27 16:51   ` Rafael J. Wysocki
2023-03-28 23:49     ` Ricardo Neri
2023-02-07  5:10 ` [PATCH v3 17/24] thermal: intel: hfi: Enable the Intel Thread Director Ricardo Neri
2023-03-27 16:53   ` Rafael J. Wysocki
2023-03-28 23:50     ` Ricardo Neri
2023-02-07  5:10 ` [PATCH v3 18/24] sched/task_struct: Add helpers for IPC classification Ricardo Neri
2023-02-07  5:11 ` [PATCH v3 19/24] sched/core: Initialize helpers of task classification Ricardo Neri
2023-02-07  5:11 ` [PATCH v3 20/24] sched/fair: Introduce sched_smt_siblings_idle() Ricardo Neri
2023-02-07  5:11 ` [PATCH v3 21/24] thermal: intel: hfi: Implement model-specific checks for task classification Ricardo Neri
2023-03-27 17:03   ` Rafael J. Wysocki
2023-03-29  0:15     ` Ricardo Neri
2023-03-29 12:21       ` Rafael J. Wysocki
2023-03-30  2:41         ` Ricardo Neri
2023-03-31 17:08           ` Rafael J. Wysocki
2023-04-03 14:12             ` Ricardo Neri
2023-02-07  5:11 ` [PATCH v3 22/24] x86/cpufeatures: Add feature bit for HRESET Ricardo Neri
2023-02-07  5:11 ` [PATCH v3 23/24] x86/hreset: Configure history reset Ricardo Neri
2023-02-07  5:11 ` [PATCH v3 24/24] x86/process: Reset hardware history in context switch Ricardo Neri
2023-03-05 22:49 ` [PATCH v3 00/24] sched: Introduce classes of tasks for load balance Ricardo Neri

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=20230330020724.GA26315@ranerica-svr.sc.intel.com \
    --to=ricardo.neri-calderon@linux.intel.com \
    --cc=bristot@redhat.com \
    --cc=bsegall@google.com \
    --cc=dietmar.eggemann@arm.com \
    --cc=ionela.voinescu@arm.com \
    --cc=joel@joelfernandes.org \
    --cc=juri.lelli@redhat.com \
    --cc=len.brown@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=lukasz.luba@arm.com \
    --cc=mgorman@suse.de \
    --cc=peterz@infradead.org \
    --cc=rafael.j.wysocki@intel.com \
    --cc=ravi.v.shankar@intel.com \
    --cc=ricardo.neri@intel.com \
    --cc=rostedt@goodmis.org \
    --cc=srinivas.pandruvada@linux.intel.com \
    --cc=tim.c.chen@intel.com \
    --cc=tim.c.chen@linux.intel.com \
    --cc=vincent.guittot@linaro.org \
    --cc=vschneid@redhat.com \
    --cc=x86@kernel.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

all inboxes | Powered by JetHome®