On Fri, 2 Nov 2018 at 16:36, Dietmar Eggemann <dietmar.eggemann@xxxxxxx> wrote:
On 10/26/18 6:11 PM, Vincent Guittot wrote:
Thinking about this new approach on a big.LITTLE platform:
CPU Capacities big: 1024 LITTLE: 512, performance CPUfreq governor
A 50% (runtime/period) task on a big CPU will become an always running
task on the little CPU. The utilization signal of the task and the
cfs_rq of the little CPU converges to 1024.
With contrib scaling the utilization signal of the 50% task converges to
512 on the little CPU, even it is always running on it, and so does the
one of the cfs_rq.
Two 25% tasks on a big CPU will become two 50% tasks on a little CPU.
The utilization signal of the tasks converges to 512 and the one of the
cfs_rq of the little CPU converges to 1024.
With contrib scaling the utilization signal of the 25% tasks converges
to 256 on the little CPU, even they run each 50% on it, and the one of
the cfs_rq converges to 512.
So what do we consider system-wide invariance? I thought that e.g. a 25%
task should have a utilization value of 256 no matter on which CPU it is
running?
In both cases, the little CPU is not going idle whereas the big CPU does.
IMO, the key point here is that there is no idle time. As soon as
there is no idle time, you don't know if a task has enough compute
capacity so you can't make difference between the 50% running task or
an always running task on the little core.
That's also interesting to noticed that the task will reach the always
running state after more than 600ms on little core with utilization
starting from 0.
Then considering the system-wide invariance, the task are not really
invariant. If we take a 50% running task that run 40ms in a period of
80ms, the max utilization of the task will be 721 on the big core and
512 on the little core.
Then, if you take a 39ms running task instead, the utilization on the
big core will reach 709 but it will be 507 on little core. So your
utilization depends on the current capacity.
With the new proposal, the max utilization will be 709 on big and
little cores for the 39ms running task. For the 40ms running task, the
utilization will be 721 on big core. then if the task moves on the
little, it will reach the value 721 after 80ms, then 900 after more
than 160ms and 1000 after 320ms