• Ingo Molnar's avatar
    sched: make the scheduler converge to the ideal latency · f6cf891c
    Ingo Molnar authored
    de-HZ-ification of the granularity defaults unearthed a pre-existing
    property of CFS: while it correctly converges to the granularity goal,
    it does not prevent run-time fluctuations in the range of
    [-gran ... 0 ... +gran].
    
    With the increase of the granularity due to the removal of HZ
    dependencies, this becomes visible in chew-max output (with 5 tasks
    running):
    
     out:  28 . 27. 32 | flu:  0 .  0 | ran:    9 .   13 | per:   37 .   40
     out:  27 . 27. 32 | flu:  0 .  0 | ran:   17 .   13 | per:   44 .   40
     out:  27 . 27. 32 | flu:  0 .  0 | ran:    9 .   13 | per:   36 .   40
     out:  29 . 27. 32 | flu:  2 .  0 | ran:   17 .   13 | per:   46 .   40
     out:  28 . 27. 32 | flu:  0 .  0 | ran:    9 .   13 | per:   37 .   40
     out:  29 . 27. 32 | flu:  0 .  0 | ran:   18 .   13 | per:   47 .   40
     out:  28 . 27. 32 | flu:  0 .  0 | ran:    9 .   13 | per:   37 .   40
    
    average slice is the ideal 13 msecs and the period is picture-perfect 40
    msecs. But the 'ran' field fluctuates around 13.33 msecs and there's no
    mechanism in CFS to keep that from happening: it's a perfectly valid
    solution that CFS finds.
    
    to fix this we add a granularity/preemption rule that knows about
    the "target latency", which makes tasks that run longer than the ideal
    latency run a bit less. The simplest approach is to simply decrease the
    preemption granularity when a task overruns its ideal latency. For this
    we have to track how much the task executed since its last preemption.
    
    ( this adds a new field to task_struct, but we can eliminate that
      overhead in 2.6.24 by putting all the scheduler timestamps into an
      anonymous union. )
    
    with this change in place, chew-max output is fluctuation-less all
    around:
    
     out:  28 . 27. 39 | flu:  0 .  2 | ran:   13 .   13 | per:   41 .   40
     out:  28 . 27. 39 | flu:  0 .  2 | ran:   13 .   13 | per:   41 .   40
     out:  28 . 27. 39 | flu:  0 .  2 | ran:   13 .   13 | per:   41 .   40
     out:  28 . 27. 39 | flu:  0 .  2 | ran:   13 .   13 | per:   41 .   40
     out:  28 . 27. 39 | flu:  0 .  1 | ran:   13 .   13 | per:   41 .   40
     out:  28 . 27. 39 | flu:  0 .  1 | ran:   13 .   13 | per:   41 .   40
    
    this patch has no impact on any fastpath or on any globally observable
    scheduling property. (unless you have sharp enough eyes to see
    millisecond-level ruckles in glxgears smoothness :-)
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
    Signed-off-by: default avatarMike Galbraith <efault@gmx.de>
    f6cf891c
sched_fair.c 29.3 KB