lkml.org 
[lkml]   [2018]   [Feb]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Subject[PATCH 0/7] sched/fair: Migrate 'misfit' tasks on asymmetric capacity systems
    Date
    On asymmetric cpu capacity systems (e.g. Arm big.LITTLE) it is crucial
    for performance that cpu intensive tasks are aggressively migrated to
    high capacity cpus as soon as those become available. The capacity
    awareness tweaks already in the wake-up path can't handle this as such
    tasks might run or be runnable forever. If they happen to be placed on a
    low capacity cpu from the beginning they are stuck there forever while
    high capacity cpus may have become available in the meantime.

    To address this issue this patch set introduces a new "misfit"
    load-balancing scenario in periodic/nohz/newly idle balance which tweaks
    the load-balance conditions to ignore load per capacity in certain
    cases. Since misfit tasks are commonly running alone on a cpu, more
    aggressive active load-balancing is needed too.

    The fundamental idea of this patch set has been in Android kernels for a
    long time and is absolutely essential for consistent performance on
    asymmetric cpu capacity systems.

    The patches have been tested on:
    1. Arm Juno (r0): 2+4 Cortex A57/A53
    2. Hikey960: 4+4 Cortex A73/A53

    Test case:
    Big cpus are always kept busy. Pin a shorter running sysbench tasks to
    big cpus, while creating a longer running set of unpinned sysbench
    tasks.

    REQUESTS=1000
    BIGS="1 2"
    LITTLES="0 3 4 5"

    # Don't care about the score for those, just keep the bigs busy
    for i in $BIGS; do
    taskset -c $i sysbench --max-requests=$((REQUESTS / 4)) \
    --test=cpu run &>/dev/null &
    done

    for i in $LITTLES; do
    sysbench --max-requests=$REQUESTS --test=cpu run \
    | grep "total time:" &
    done

    wait

    Results:
    Single runs with completion time of each task
    Juno (tip)
    total time: 1.2608s
    total time: 1.2995s
    total time: 1.5954s
    total time: 1.7463s

    Juno (misfit)
    total time: 1.2575s
    total time: 1.3004s
    total time: 1.5860s
    total time: 1.5871s

    Hikey960 (tip)
    total time: 1.7431s
    total time: 2.2914s
    total time: 2.5976s
    total time: 1.7280s

    Hikey960 (misfit)
    total time: 1.7866s
    total time: 1.7513s
    total time: 1.6918s
    total time: 1.6965s

    10 run summary (tracking longest running task for each run)
    Juno Hikey960
    avg max avg max
    tip 1.7465 1.7469 2.5997 2.6131
    misfit 1.6016 1.6192 1.8506 1.9666

    Morten Rasmussen (4):
    sched: Add static_key for asymmetric cpu capacity optimizations
    sched/fair: Add group_misfit_task load-balance type
    sched/fair: Consider misfit tasks when load-balancing
    sched/fair: Avoid unnecessary balancing of asymmetric capacity groups

    Valentin Schneider (3):
    sched/fair: Kick nohz balance if rq->misfit_task
    sched: Rename root_domain->overload to should_idle_balance
    sched/fair: Set sd->should_idle_balance when misfit

    kernel/sched/fair.c | 141 +++++++++++++++++++++++++++++++++++++++++-------
    kernel/sched/sched.h | 15 ++++--
    kernel/sched/topology.c | 10 ++++
    3 files changed, 142 insertions(+), 24 deletions(-)

    --
    2.7.4

    \
     
     \ /
      Last update: 2018-02-15 17:24    [W:4.027 / U:0.472 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site