sched/core: Accounting forceidle time for all tasks except idle task

Bugzilla: http://bugzilla.redhat.com/2062831

commit b171501f258063f5c56dd2c5fdf310802d8d7dc1
Author: Cruz Zhao <CruzZhao@linux.alibaba.com>
Date:   Tue Jan 11 17:55:59 2022 +0800

    sched/core: Accounting forceidle time for all tasks except idle task

    There are two types of forced idle time: forced idle time from cookie'd
    task and forced idle time form uncookie'd task. The forced idle time from
    uncookie'd task is actually caused by the cookie'd task in runqueue
    indirectly, and it's more accurate to measure the capacity loss with the
    sum of both.

    Assuming cpu x and cpu y are a pair of SMT siblings, consider the
    following scenarios:
      1.There's a cookie'd task running on cpu x, and there're 4 uncookie'd
        tasks running on cpu y. For cpu x, there will be 80% forced idle time
        (from uncookie'd task); for cpu y, there will be 20% forced idle time
        (from cookie'd task).
      2.There's a uncookie'd task running on cpu x, and there're 4 cookie'd
        tasks running on cpu y. For cpu x, there will be 80% forced idle time
        (from cookie'd task); for cpu y, there will be 20% forced idle time
        (from uncookie'd task).

    The scenario1 can recurrent by stress-ng(scenario2 can recurrent similary):
        (cookie'd)taskset -c x stress-ng -c 1 -l 100
        (uncookie'd)taskset -c y stress-ng -c 4 -l 100

    In the above two scenarios, the total capacity loss is 1 cpu, but in
    scenario1, the cookie'd forced idle time tells us 20% cpu capacity loss, in
    scenario2, the cookie'd forced idle time tells us 80% cpu capacity loss,
    which are not accurate. It'll be more accurate to measure with cookie'd
    forced idle time and uncookie'd forced idle time.

    Signed-off-by: Cruz Zhao <CruzZhao@linux.alibaba.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: Josh Don <joshdon@google.com>
    Link: https://lore.kernel.org/r/1641894961-9241-2-git-send-email-CruzZhao@linux.alibaba.com

Signed-off-by: Phil Auld <pauld@redhat.com>
This commit is contained in:
Phil Auld 2022-03-22 16:35:31 -04:00
parent ad2f1aab97
commit e99d064416
2 changed files with 2 additions and 3 deletions

View File

@ -5831,8 +5831,7 @@ pick_next_task(struct rq *rq, struct task_struct *prev, struct rq_flags *rf)
}
if (schedstat_enabled() && rq->core->core_forceidle_count) {
if (cookie)
rq->core->core_forceidle_start = rq_clock(rq->core);
rq->core->core_forceidle_start = rq_clock(rq->core);
rq->core->core_forceidle_occupation = occ;
}

View File

@ -273,7 +273,7 @@ void __sched_core_account_forceidle(struct rq *rq)
rq_i = cpu_rq(i);
p = rq_i->core_pick ?: rq_i->curr;
if (!p->core_cookie)
if (p == rq_i->idle)
continue;
__schedstat_add(p->stats.core_forceidle_sum, delta);