From: Chen Yu <yu.c.chen@intel.com>
To: Chunxin Zang <spring.cxz@gmail.com>
Cc: K Prateek Nayak <kprateek.nayak@amd.com>, <mingo@redhat.com>,
"Peter Zijlstra" <peterz@infradead.org>, <juri.lelli@redhat.com>,
<vincent.guittot@linaro.org>, <dietmar.eggemann@arm.com>,
<rostedt@goodmis.org>, <bsegall@google.com>, <mgorman@suse.de>,
<bristot@redhat.com>, <vschneid@redhat.com>,
<linux-kernel@vger.kernel.org>, <yangchen11@lixiang.com>,
Jerry Zhou <zhouchunhua@lixiang.com>,
Chunxin Zang <zangchunxin@lixiang.com>,
Balakumaran Kannan <kumaran.4353@gmail.com>,
"Mike Galbraith" <efault@gmx.de>
Subject: Re: [PATCH] sched/fair: Reschedule the cfs_rq when current is ineligible
Date: Fri, 7 Jun 2024 10:38:14 +0800 [thread overview]
Message-ID: <ZmJylkNFg7EFgPmZ@chenyu5-mobl2> (raw)
In-Reply-To: <CF70ED2D-2566-4CA7-A9BB-E8536F353797@gmail.com>
On 2024-06-06 at 09:46:53 +0800, Chunxin Zang wrote:
>
>
> > On Jun 6, 2024, at 01:19, Chen Yu <yu.c.chen@intel.com> wrote:
> >
> >
> > Sorry for the late reply and thanks for help clarify this. Yes, this is
> > what my previous concern was:
> > 1. It does not consider the cgroup and does not check preemption in the same
> > level which is covered by find_matching_se().
> > 2. The if (!entity_eligible(cfs_rq, se)) for current is redundant because
> > later pick_eevdf() will check the eligible of current anyway. But
> > as pointed out by Chunxi, his concern is the double-traverse of the rb-tree,
> > I just wonder if we could leverage the cfs_rq->next to store the next
> > candidate, so it can be picked directly in the 2nd pick as a fast path?
> > Something like below untested:
> >
> > diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
> > index 8a5b1ae0aa55..f716646d595e 100644
> > --- a/kernel/sched/fair.c
> > +++ b/kernel/sched/fair.c
> > @@ -8349,7 +8349,7 @@ static void set_next_buddy(struct sched_entity *se)
> > static void check_preempt_wakeup_fair(struct rq *rq, struct task_struct *p, int wake_flags)
> > {
> > struct task_struct *curr = rq->curr;
> > - struct sched_entity *se = &curr->se, *pse = &p->se;
> > + struct sched_entity *se = &curr->se, *pse = &p->se, *next;
> > struct cfs_rq *cfs_rq = task_cfs_rq(curr);
> > int cse_is_idle, pse_is_idle;
> >
> > @@ -8415,7 +8415,11 @@ static void check_preempt_wakeup_fair(struct rq *rq, struct task_struct *p, int
> > /*
> > * XXX pick_eevdf(cfs_rq) != se ?
> > */
> > - if (pick_eevdf(cfs_rq) == pse)
> > + next = pick_eevdf(cfs_rq);
> > + if (sched_feat(NEXT_BUDDY) && !(wake_flags & WF_FORK) && next)
> > + set_next_buddy(next);
> > +
> > + if (next == pse)
> > goto preempt;
> >
> > return;
> >
> >
> > thanks,
> > Chenyu
>
> Hi Chen
>
> First of all, thank you for your patient response. Regarding the issue of avoiding traversing
> the RB-tree twice, I initially had two methods in mind.
> 1. Cache the optimal result so that it can be used directly during the second pick_eevdf operation.
> This idea is similar to the one you proposed this time.
> 2. Avoid the pick_eevdf operation as much as possible within 'check_preempt_wakeup_fair.'
> Because I believe that 'checking whether preemption is necessary' and 'finding the optimal
> process to schedule' are two different things.
I agree, and it seems that in current eevdf implementation the former relies on the latter.
> 'check_preempt_wakeup_fair' is not just to
> check if the newly awakened process should preempt the current process; it can also serve
> as an opportunity to check whether any other processes should preempt the current one,
> thereby improving the real-time performance of the scheduler. Although now in pick_eevdf,
> the legitimacy of 'curr' is also evaluated, if the result returned is not the awakened process,
> then the current process will still not be preempted.
I thought Mike has proposed a patch to deal with this scenario you mentioned above:
https://lore.kernel.org/lkml/e17d3d90440997b970067fe9eaf088903c65f41d.camel@gmx.de/
And I suppose you are refering to increase the preemption chance on current rather than reducing
the invoke of pick_eevdf() in check_preempt_wakeup_fair().
> Therefore, I posted the v2 PATCH.
> The implementation of v2 PATCH might express this point more clearly.
> https://lore.kernel.org/lkml/20240529141806.16029-1-spring.cxz@gmail.com/T/
>
Let me take a look at it and do some tests.
> I previously implemented and tested both of these methods, and the test results showed that
> method 2 had somewhat more obvious benefits. Therefore, I submitted method 2. Now that I
> think about it, perhaps method 1 could also be viable at the same time. :)
>
Actually I found that, even without any changes, if we enabled sched feature NEXT_BUDDY, the
wakeup latency/request latency are both reduced. The following is the schbench result on a
240 CPUs system:
NO_NEXT_BUDDY
Wakeup Latencies percentiles (usec) runtime 100 (s) (1698990 total samples)
50.0th: 6 (429125 samples)
90.0th: 14 (682355 samples)
* 99.0th: 29 (126695 samples)
99.9th: 529 (14603 samples)
min=1, max=4741
Request Latencies percentiles (usec) runtime 100 (s) (1702523 total samples)
50.0th: 14992 (550939 samples)
90.0th: 15376 (668687 samples)
* 99.0th: 15600 (128111 samples)
99.9th: 15888 (11238 samples)
min=3528, max=31677
RPS percentiles (requests) runtime 100 (s) (101 total samples)
20.0th: 16864 (31 samples)
* 50.0th: 16928 (26 samples)
90.0th: 17248 (36 samples)
min=16615, max=20041
average rps: 17025.23
NEXT_BUDDY
Wakeup Latencies percentiles (usec) runtime 100 (s) (1653564 total samples)
50.0th: 5 (376845 samples)
90.0th: 12 (632075 samples)
* 99.0th: 24 (114398 samples)
99.9th: 105 (13737 samples)
min=1, max=7428
Request Latencies percentiles (usec) runtime 100 (s) (1657268 total samples)
50.0th: 14480 (524763 samples)
90.0th: 15216 (647982 samples)
* 99.0th: 15472 (130730 samples)
99.9th: 15728 (13980 samples)
min=3542, max=34805
RPS percentiles (requests) runtime 100 (s) (101 total samples)
20.0th: 16544 (62 samples)
* 50.0th: 16544 (0 samples)
90.0th: 16608 (37 samples)
min=16470, max=16648
average rps: 16572.68
So I think NEXT_BUDDY has more or less reduced the rb-tree scan.
thanks,
Chenyu
next prev parent reply other threads:[~2024-06-07 2:38 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-24 13:40 [PATCH] sched/fair: Reschedule the cfs_rq when current is ineligible Chunxin Zang
2024-05-24 15:30 ` Chen Yu
2024-05-28 2:42 ` Chunxin Zang
2024-05-28 5:02 ` K Prateek Nayak
2024-05-28 7:18 ` Chunxin Zang
2024-05-28 7:47 ` K Prateek Nayak
2024-06-05 17:19 ` Chen Yu
2024-06-06 1:46 ` Chunxin Zang
2024-06-07 2:38 ` Chen Yu [this message]
2024-06-11 13:10 ` Chunxin Zang
2024-06-13 11:45 ` Chen Yu
2024-05-28 6:41 ` Chunxin Zang
2024-05-25 6:41 ` Mike Galbraith
2024-05-25 11:57 ` Chen Yu
2024-05-25 17:22 ` Mike Galbraith
2024-05-27 8:05 ` Peter Zijlstra
2024-05-27 9:53 ` Mike Galbraith
2024-05-25 11:48 ` Honglei Wang
[not found] ` <6AF97701-B8F4-46C6-851E-A8BACE97E8C0@gmail.com>
2024-06-03 2:55 ` Honglei Wang
2024-06-06 12:39 ` Chunxin Zang
2024-06-11 11:39 ` Honglei Wang
2024-05-29 6:06 ` kernel test robot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZmJylkNFg7EFgPmZ@chenyu5-mobl2 \
--to=yu.c.chen@intel.com \
--cc=bristot@redhat.com \
--cc=bsegall@google.com \
--cc=dietmar.eggemann@arm.com \
--cc=efault@gmx.de \
--cc=juri.lelli@redhat.com \
--cc=kprateek.nayak@amd.com \
--cc=kumaran.4353@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mgorman@suse.de \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=spring.cxz@gmail.com \
--cc=vincent.guittot@linaro.org \
--cc=vschneid@redhat.com \
--cc=yangchen11@lixiang.com \
--cc=zangchunxin@lixiang.com \
--cc=zhouchunhua@lixiang.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.