Re: [PATCH] sched/fair: Prefer idle CPU to cache affinity
From: Rik van Riel
Date: Sat Feb 27 2021 - 14:57:19 EST
On Fri, 2021年02月26日 at 22:10 +0530, Srikar Dronamraju wrote:
>
Current order of preference to pick a LLC while waking a wake-affine
>
task:
>
1. Between the waker CPU and previous CPU, prefer the LLC of the CPU
>
that is idle.
>
>
2. Between the waker CPU and previous CPU, prefer the LLC of the CPU
>
that is less lightly loaded.
>
>
In the current situation where waker and previous CPUs are busy, but
>
only one of its LLC has an idle CPU, Scheduler may end up picking a
>
LLC
>
with no idle CPUs. To mitigate this, add a new step between 1 and 2
>
where Scheduler compares idle CPUs in waker and previous LLCs and
>
picks
>
the appropriate one.
I like that idea a lot. That could also solve some of the
issues sometimes observed on multi-node x86 systems, and
probably on the newer AMD chips with several LLCs on chip.
>
+ if (sched_feat(WA_WAKER) && tnr_busy < tllc_size)
>
+ return this_cpu;
I wonder if we need to use a slightly lower threshold on
very large LLCs, both to account for the fact that the
select_idle_cpu code may not find the single idle CPU
among a dozen busy ones, or because on a system with
hyperthreading we may often be better off picking another
LLC for HT contention issues?
Maybe we could use "tnr_busy * 4 <
tllc_size * 3" or
something like that?
That way we will only try to find the last 5 idle
CPUs
in a 22 CPU LLC if the other LLC also has fewer than 6
idle cores.
That might increase our chances of finding an idle CPU
with SIS_PROP enabled, and might allow WA_WAKER to be
true by default.
>
+ /* For better wakeup latency, prefer idler LLC to cache
>
affinity */
>
+ diff = tnr_busy * pllc_size - sync - pnr_busy * tllc_size;
>
+ if (!diff)
>
+ return nr_cpumask_bits;
>
+ if (diff < 0)
>
+ return this_cpu;
>
+
>
+ return prev_cpu;
>
+}
--
All Rights Reversed.
Attachment:
signature.asc
Description: This is a digitally signed message part