• Vincent Guittot's avatar
    sched: Improve sysbench performance by fixing spurious active migration · 43f4d666
    Vincent Guittot authored
    Since commit caeb178c ("sched/fair: Make update_sd_pick_busiest() ...")
    sd_pick_busiest returns a group that can be neither imbalanced nor overloaded
    but is only more loaded than others. This change has been introduced to ensure
    a better load balance in system that are not overloaded but as a side effect,
    it can also generate useless active migration between groups.
    
    Let take the example of 3 tasks on a quad cores system. We will always have an
    idle core so the load balance will find a busiest group (core) whenever an ILB
    is triggered and it will force an active migration (once above
    nr_balance_failed threshold) so the idle core becomes busy but another core
    will become idle. With the next ILB, the freshly idle core will try to pull the
    task of a busy CPU.
    The number of spurious active migration is not so huge in quad core system
    because the ILB is not triggered so much. But it becomes significant as soon as
    you have more than one sched_domain level like on a dual cluster of quad cores
    where the ILB is triggered every tick when you have more than 1 busy_cpu
    
    We need to ensure that the migration generate a real improveùent and will not
    only move the avg_load imbalance on another CPU.
    
    Before caeb178c, the filtering of such use
    case was ensured by the following test in f_b_g:
    
      if ((local->idle_cpus < busiest->idle_cpus) &&
    		    busiest->sum_nr_running  <= busiest->group_weight)
    
    This patch modified the condition to take into account situation where busiest
    group is not overloaded: If the diff between the number of idle cpus in 2
    groups is less than or equal to 1 and the busiest group is not overloaded,
    moving a task will not improve the load balance but just move it.
    
    A test with sysbench on a dual clusters of quad cores gives the following
    results:
    
      command: sysbench --test=cpu --num-threads=5 --max-time=5 run
    
    The HZ is 200 which means that 1000 ticks has fired during the test.
    
    With Mainline, perf gives the following figures:
    
     Samples: 727  of event 'sched:sched_migrate_task'
     Event count (approx.): 727
      Overhead  Command          Shared Object  Symbol
      ........  ...............  .............  ..............
        12.52%  migration/1      [unknown]      [.] 00000000
        12.52%  migration/5      [unknown]      [.] 00000000
        12.52%  migration/7      [unknown]      [.] 00000000
        12.10%  migration/6      [unknown]      [.] 00000000
        11.83%  migration/0      [unknown]      [.] 00000000
        11.83%  migration/3      [unknown]      [.] 00000000
        11.14%  migration/4      [unknown]      [.] 00000000
        10.87%  migration/2      [unknown]      [.] 00000000
         2.75%  sysbench         [unknown]      [.] 00000000
         0.83%  swapper          [unknown]      [.] 00000000
         0.55%  ktps65090charge  [unknown]      [.] 00000000
         0.41%  mmcqd/1          [unknown]      [.] 00000000
         0.14%  perf             [unknown]      [.] 00000000
    
    With this patch, perf gives the following figures
    
     Samples: 20  of event 'sched:sched_migrate_task'
     Event count (approx.): 20
      Overhead  Command          Shared Object  Symbol
      ........  ...............  .............  ..............
        80.00%  sysbench         [unknown]      [.] 00000000
        10.00%  swapper          [unknown]      [.] 00000000
         5.00%  ktps65090charge  [unknown]      [.] 00000000
         5.00%  migration/1      [unknown]      [.] 00000000
    Signed-off-by: default avatarVincent Guittot <vincent.guittot@linaro.org>
    Reviewed-by: default avatarRik van Riel <riel@redhat.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Link: http://lkml.kernel.org/r/1412170735-5356-1-git-send-email-vincent.guittot@linaro.orgSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    43f4d666
fair.c 206 KB