[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 1/2] credit: Limit load balancing to once per millisecond
On 30/06/2023 12:37 pm, George Dunlap wrote: > The credit scheduler tries as hard as it can to ensure that it always > runs scheduling units with positive credit (PRI_TS_UNDER) before > running those with negative credit (PRI_TS_OVER). If the next > runnable scheduling unit is of priority OVER, it will always run the > load balancer, which will scour the system looking for another > scheduling unit of the UNDER priority. > > Unfortunately, as the number of cores on a system has grown, the cost > of the work-stealing algorithm has dramatically increased; a recent > trace on a system with 128 cores showed this taking over 50 > microseconds. > > Add a parameter, load_balance_ratelimit, to limit the frequency of > load balance operations on a given pcpu. Default this to 1 > millisecond. > > Invert the load balancing conditional to make it more clear, and line > up more closely with the comment above it. > > Overall it might be cleaner to have the last_load_balance checking > happen inside csched_load_balance(), but that would require either > passing both now and spc into the function, or looking them up again; > both of which seemed to be worse than simply checking and setting the > values before calling it. > > Without this patch, on a system with a vcpu:pcpu ratio of 2:1, running > Windows guests (which will end up calling YIELD during spinlock > contention), this patch increased performance significantly. > > Signed-off-by: George Dunlap <george.dunlap@xxxxxxxxx> > --- > CC: Dario Faggioli <dfaggioli@xxxxxxxx> > CC: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> > CC: George Dunlap <george.dunlap@xxxxxxxxxx> > CC: Jan Beulich <jbeulich@xxxxxxxx> > CC: Julien Grall <julien@xxxxxxx> > CC: Stefano Stabellini <sstabellini@xxxxxxxxxx> > CC: Wei Liu <wl@xxxxxxx> > --- > docs/misc/xen-command-line.pandoc | 6 +++++ > xen/common/sched/credit.c | 40 ++++++++++++++++++++++++++----- > xen/include/public/sysctl.h | 6 +++++ Given this filelist, why the sysctl change? There's no logic to drive this parameter in the xc/libxl param get/set. The only two in-tree users I can see are xenpm, along with an unconditional print to stderr saying it's deprecated and to use xl, and xl. > diff --git a/docs/misc/xen-command-line.pandoc > b/docs/misc/xen-command-line.pandoc > index 4060ebdc5d..369557020f 100644 > --- a/docs/misc/xen-command-line.pandoc > +++ b/docs/misc/xen-command-line.pandoc > @@ -1856,6 +1856,12 @@ By default, Xen will use the INVPCID instruction for > TLB management if > it is available. This option can be used to cause Xen to fall back to > older mechanisms, which are generally slower. > > +### load-balance-ratelimit > +> `= <integer>` > + > +The minimum interval between load balancing events on a given pcpu. > +At the moment only credit honors this parameter. So this is intended to be a global scheduler parameter? > diff --git a/xen/common/sched/credit.c b/xen/common/sched/credit.c > index f2cd3d9da3..b8bdfd5f6a 100644 > --- a/xen/common/sched/credit.c > +++ b/xen/common/sched/credit.c > @@ -1267,7 +1272,8 @@ csched_sys_cntl(const struct scheduler *ops, > && (params->ratelimit_us > XEN_SYSCTL_SCHED_RATELIMIT_MAX > || params->ratelimit_us < > XEN_SYSCTL_SCHED_RATELIMIT_MIN)) > || MICROSECS(params->ratelimit_us) > > MILLISECS(params->tslice_ms) > - || params->vcpu_migr_delay_us > > XEN_SYSCTL_CSCHED_MGR_DLY_MAX_US ) > + || params->vcpu_migr_delay_us > XEN_SYSCTL_CSCHED_MGR_DLY_MAX_US > + || params->load_balance_ratelimit_us > > XEN_SYSCTL_CSCHED_LB_RATE_MAX_US) Style (give or take this hunk being with some logic to drive the new sysctl). > @@ -1963,10 +1979,12 @@ static void cf_check csched_schedule( > * urgent work... If not, csched_load_balance() will return snext, > but > * already removed from the runq. > */ > - if ( snext->pri > CSCHED_PRI_TS_OVER ) > - __runq_remove(snext); > - else > + if ( snext->pri <= CSCHED_PRI_TS_OVER > + && now - spc->last_load_balance > prv->load_balance_ratelimit) { > + spc->last_load_balance = now; > snext = csched_load_balance(prv, sched_cpu, snext, &migrated); > + } else > + __runq_remove(snext); Style. ~Andrew
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |