|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] xen/sched_credit: Use delay to control scheduling frequency
Ping?
On Tue, Jan 10, 2012 at 10:05 AM, George Dunlap
<George.Dunlap@xxxxxxxxxxxxx> wrote:
> On Mon, Jan 9, 2012 at 10:22 AM, Hui Lv <hui.lv@xxxxxxxxx> wrote:
>> Updated the warning sentence for ratelimit_us.
>>
>> This patch can improve Xen performance:
>> 1. Basically, the "delay method" can achieve 11% overall performance boost
>> for SPECvirt than original credit scheduler.
>> 2. We have tried 1ms delay and 10ms delay, there is no big difference
>> between these two configurations. (1ms is enough to achieve a good
>> performance)
>> 3. We have compared different load level response time/latency (low, high,
>> peak), "delay method" didn't bring very much response time increase.
>> 4. 1ms delay can reduce 30% context switch at peak performance, where
>> produces the benefits. (int sched_ratelimit_us = 1000 is the recommended
>> setting)
>>
>> Signed-off-by: Hui Lv <hui.lv@xxxxxxxxx>
>> Signed-off-by: George Dunlap <george.dunlap@xxxxxxxxxxxxx>
>>
>> Acked-by: George Dunlap <george.dunlap@xxxxxxxxxxxxx>
>
> Just confirming this:
> Acked-by: George Dunlap <george.dunlap@xxxxxxxxxxxxx>
>
> Thanks, Hui.
> -George
>
>>
>> diff -r a4bff36780a3 -r fe8d0ca867aa xen/common/sched_credit.c
>> --- a/xen/common/sched_credit.c Fri Dec 16 18:46:27 2011 +0000
>> +++ b/xen/common/sched_credit.c Mon Jan 09 05:21:35 2012 -0500
>> @@ -172,6 +172,7 @@ struct csched_private {
>> uint32_t credit;
>> int credit_balance;
>> uint32_t runq_sort;
>> + unsigned ratelimit_us;
>> /* Period of master and tick in milliseconds */
>> unsigned tslice_ms, tick_period_us, ticks_per_tslice;
>> unsigned credits_per_tslice;
>> @@ -1297,10 +1298,15 @@ csched_schedule(
>> struct csched_private *prv = CSCHED_PRIV(ops);
>> struct csched_vcpu *snext;
>> struct task_slice ret;
>> + s_time_t runtime, tslice;
>>
>> CSCHED_STAT_CRANK(schedule);
>> CSCHED_VCPU_CHECK(current);
>>
>> + runtime = now - current->runstate.state_entry_time;
>> + if ( runtime < 0 ) /* Does this ever happen? */
>> + runtime = 0;
>> +
>> if ( !is_idle_vcpu(scurr->vcpu) )
>> {
>> /* Update credits of a non-idle VCPU. */
>> @@ -1313,6 +1319,35 @@ csched_schedule(
>> scurr->pri = CSCHED_PRI_IDLE;
>> }
>>
>> + /* Choices, choices:
>> + * - If we have a tasklet, we need to run the idle vcpu no matter what.
>> + * - If sched rate limiting is in effect, and the current vcpu has
>> + * run for less than that amount of time, continue the current one,
>> + * but with a shorter timeslice and return it immediately
>> + * - Otherwise, chose the one with the highest priority (which may
>> + * be the one currently running)
>> + * - If the currently running one is TS_OVER, see if there
>> + * is a higher priority one waiting on the runqueue of another
>> + * cpu and steal it.
>> + */
>> +
>> + /* If we have schedule rate limiting enabled, check to see
>> + * how long we've run for. */
>> + if ( !tasklet_work_scheduled
>> + && prv->ratelimit_us
>> + && vcpu_runnable(current)
>> + && !is_idle_vcpu(current)
>> + && runtime < MICROSECS(prv->ratelimit_us) )
>> + {
>> + snext = scurr;
>> + snext->start_time += now;
>> + perfc_incr(delay_ms);
>> + tslice = MICROSECS(prv->ratelimit_us);
>> + ret.migrated = 0;
>> + goto out;
>> + }
>> + tslice = MILLISECS(prv->tslice_ms);
>> +
>> /*
>> * Select next runnable local VCPU (ie top of local runq)
>> */
>> @@ -1367,11 +1402,12 @@ csched_schedule(
>> if ( !is_idle_vcpu(snext->vcpu) )
>> snext->start_time += now;
>>
>> +out:
>> /*
>> * Return task to run next...
>> */
>> ret.time = (is_idle_vcpu(snext->vcpu) ?
>> - -1 : MILLISECS(prv->tslice_ms));
>> + -1 : tslice);
>> ret.task = snext->vcpu;
>>
>> CSCHED_VCPU_CHECK(ret.task);
>> @@ -1533,6 +1569,15 @@ csched_init(struct scheduler *ops)
>> prv->tick_period_us = prv->tslice_ms * 1000 / prv->ticks_per_tslice;
>> prv->credits_per_tslice = CSCHED_CREDITS_PER_MSEC * prv->tslice_ms;
>>
>> + if ( MICROSECS(sched_ratelimit_us) > MILLISECS(sched_credit_tslice_ms) )
>> + {
>> + printk("WARNING: sched_ratelimit_us >"
>> + "sched_credit_tslice_ms is undefined\n"
>> + "Setting ratelimit_us to 1000 * tslice_ms\n");
>> + prv->ratelimit_us = 1000 * prv->tslice_ms;
>> + }
>> + else
>> + prv->ratelimit_us = sched_ratelimit_us;
>> return 0;
>> }
>>
>> diff -r a4bff36780a3 -r fe8d0ca867aa xen/common/schedule.c
>> --- a/xen/common/schedule.c Fri Dec 16 18:46:27 2011 +0000
>> +++ b/xen/common/schedule.c Mon Jan 09 05:21:35 2012 -0500
>> @@ -47,6 +47,11 @@ string_param("sched", opt_sched);
>> bool_t sched_smt_power_savings = 0;
>> boolean_param("sched_smt_power_savings", sched_smt_power_savings);
>>
>> +/* Default scheduling rate limit: 1ms
>> + * The behavior when sched_ratelimit_us is greater than
>> sched_credit_tslice_ms is undefined
>> + * */
>> +int sched_ratelimit_us = 1000;
>> +integer_param("sched_ratelimit_us", sched_ratelimit_us);
>> /* Various timer handlers. */
>> static void s_timer_fn(void *unused);
>> static void vcpu_periodic_timer_fn(void *data);
>> diff -r a4bff36780a3 -r fe8d0ca867aa xen/include/xen/perfc_defn.h
>> --- a/xen/include/xen/perfc_defn.h Fri Dec 16 18:46:27 2011 +0000
>> +++ b/xen/include/xen/perfc_defn.h Mon Jan 09 05:21:35 2012 -0500
>> @@ -16,6 +16,7 @@ PERFCOUNTER(sched_irq, "sch
>> PERFCOUNTER(sched_run, "sched: runs through scheduler")
>> PERFCOUNTER(sched_ctx, "sched: context switches")
>>
>> +PERFCOUNTER(delay_ms, "csched: delay")
>> PERFCOUNTER(vcpu_check, "csched: vcpu_check")
>> PERFCOUNTER(schedule, "csched: schedule")
>> PERFCOUNTER(acct_run, "csched: acct_run")
>> diff -r a4bff36780a3 -r fe8d0ca867aa xen/include/xen/sched-if.h
>> --- a/xen/include/xen/sched-if.h Fri Dec 16 18:46:27 2011 +0000
>> +++ b/xen/include/xen/sched-if.h Mon Jan 09 05:21:35 2012 -0500
>> @@ -16,6 +16,11 @@ extern struct cpupool *cpupool0;
>> /* cpus currently in no cpupool */
>> extern cpumask_t cpupool_free_cpus;
>>
>> +/* Scheduler generic parameters
>> + * */
>> +extern int sched_ratelimit_us;
>> +
>> +
>> /*
>> * In order to allow a scheduler to remap the lock->cpu mapping,
>> * we have a per-cpu pointer, along with a pre-allocated set of
>>
>> _______________________________________________
>> Xen-devel mailing list
>> Xen-devel@xxxxxxxxxxxxxxxxxxx
>> http://lists.xensource.com/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |