• Vincent Guittot's avatar
    sched/core: Use load_avg for selecting idlest group · 6b94780e
    Vincent Guittot authored
    find_idlest_group() only compares the runnable_load_avg when looking
    for the least loaded group. But on fork intensive use case like
    hackbench where tasks blocked quickly after the fork, this can lead to
    selecting the same CPU instead of other CPUs, which have similar
    runnable load but a lower load_avg.
    
    When the runnable_load_avg of 2 CPUs are close, we now take into
    account the amount of blocked load as a 2nd selection factor. There is
    now 3 zones for the runnable_load of the rq:
    
     - [0 .. (runnable_load - imbalance)]:
    	Select the new rq which has significantly less runnable_load
    
     - [(runnable_load - imbalance) .. (runnable_load + imbalance)]:
    	The runnable loads are close so we use load_avg to chose
    	between the 2 rq
    
     - [(runnable_load + imbalance) .. ULONG_MAX]:
    	Keep the current rq which has significantly less runnable_load
    
    The scale factor that is currently used for comparing runnable_load,
    doesn't work well with small value. As an example, the use of a
    scaling factor fails as soon as this_runnable_load == 0 because we
    always select local rq even if min_runnable_load is only 1, which
    doesn't really make sense because they are just the same. So instead
    of scaling factor, we use an absolute margin for runnable_load to
    detect CPUs with similar runnable_load and we keep using scaling
    factor for blocked load.
    
    For use case like hackbench, this enable the scheduler to select
    different CPUs during the fork sequence and to spread tasks across the
    system.
    
    Tests have been done on a Hikey board (ARM based octo cores) for
    several kernel. The result below gives min, max, avg and stdev values
    of 18 runs with each configuration.
    
    The patches depend on the "no missing update_rq_clock()" work.
    
    hackbench -P -g 1
    
             ea86cb4b  7dc603c9  v4.8        v4.8+patches
      min    0.049         0.050         0.051       0,048
      avg    0.057         0.057(0%)     0.057(0%)   0,055(+5%)
      max    0.066         0.068         0.070       0,063
      stdev  +/-9%         +/-9%         +/-8%       +/-9%
    
    More performance numbers here:
    
      https://lkml.kernel.org/r/20161203214707.GI20785@codeblueprint.co.ukTested-by: default avatarMatt Fleming <matt@codeblueprint.co.uk>
    Signed-off-by: default avatarVincent Guittot <vincent.guittot@linaro.org>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: default avatarMatt Fleming <matt@codeblueprint.co.uk>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Morten.Rasmussen@arm.com
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: dietmar.eggemann@arm.com
    Cc: kernellwp@gmail.com
    Cc: umgwanakikbuti@gmail.com
    Cc: yuyang.du@intel.comc
    Link: http://lkml.kernel.org/r/1481216215-24651-3-git-send-email-vincent.guittot@linaro.orgSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    6b94780e
fair.c 247 KB