[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 9 of 9] xl: Implement sched-credit schedule parameter command-line interface



On Wed, Feb 22, 2012 at 4:15 PM, George Dunlap
<george.dunlap@xxxxxxxxxxxxx> wrote:
> Add features to the sched-credit interface to allow querying and
> displaying scheduler parameters.
>
> v2:
>  - Change function line breaks
>  - Pool output deals gracefully with other schedulers
>  - Add new parameters, as well as a description of how they
>   interact, to the xl man page

BTW, there was a brief suggestion that rather than sharing the same
command (which requires a big table to explain how the various options
interact), we break out sched-credit into two, possibly three
commands; one of which would read all scheduler information, the other
two which would specifically get or set domain and scheduler-wide
parameters.  Any thoughts on this?

 -G

>
> Signed-off-by: George Dunlap <george.dunlap@xxxxxxxxxxxxx>
>
> diff -r 5600db2bcd0e -r 0f91ce7b095a docs/man/xl.pod.1
> --- a/docs/man/xl.pod.1 Wed Feb 22 16:08:28 2012 +0000
> +++ b/docs/man/xl.pod.1 Wed Feb 22 16:08:28 2012 +0000
> @@ -714,6 +714,53 @@ no upper cap.
>
>  Restrict output to domains in the specified cpupool.
>
> +=item B<-s>, B<--schedparam>
> +
> +Specify to list or set pool-wide scheduler parameters.
> +
> +=item B<-t TSLICE>, B<--tslice_ms=TSLICE>
> +
> +Timeslice tells the scheduler how long to allow VMs to run before
> +pre-empting.  The default is 30ms.  Valid ranges are 1ms to 1000ms.
> +The length of the timeslice (in ms) must be higher than the length of
> +the ratelimit (see below).
> +
> +=item B<-r RLIMIT>, B<--ratelimit_us=RLIMIT>
> +
> +Ratelimit attempts to limit the number of schedules per second.  It
> +sets a minimum amount of time (in microseconds) a VM must run before
> +we will allow a higher-prioirty VM to pre-empt it.  The default value
> +is 1000 microseconds (1ms).  Valid range is 100 to 500000 (500ms).
> +The ratelimit length must be lower than the timeslice length.
> +
> +=back
> +
> +B<COMBINATION>
> +
> +The following is the effect of combining the above options:
> +
> +=over 4
> +
> +=item B<E<lt>nothingE<gt>>             : List all domain params and sched 
> params from all pools
> +
> +=item B<-d [domid]>            : List domain params for domain [domid]
> +
> +=item B<-d [domid] [params]>   : Set domain params for domain [domid]
> +
> +=item B<-p [pool]>             : list all domains and sched params for [pool]
> +
> +=item B<-s>                    : List sched params for poolid 0
> +
> +=item B<-s [params]>           : Set sched params for poolid 0
> +
> +=item B<-p [pool] -s>          : List sched params for [pool]
> +
> +=item B<-p [pool] -s [params]> : Set sched params for [pool]
> +
> +=item B<-p [pool] -d>...       : Illegal
> +
> +=item
> +
>  =back
>
>  =item B<sched-credit2> [I<OPTIONS>]
> diff -r 5600db2bcd0e -r 0f91ce7b095a tools/libxl/xl_cmdimpl.c
> --- a/tools/libxl/xl_cmdimpl.c  Wed Feb 22 16:08:28 2012 +0000
> +++ b/tools/libxl/xl_cmdimpl.c  Wed Feb 22 16:08:28 2012 +0000
> @@ -3912,8 +3912,7 @@ int main_sharing(int argc, char **argv)
>     return 0;
>  }
>
> -static int sched_credit_domain_get(
> -    int domid, libxl_sched_credit_domain *scinfo)
> +static int sched_credit_domain_get(int domid, libxl_sched_credit_domain 
> *scinfo)
>  {
>     int rc;
>
> @@ -3924,8 +3923,7 @@ static int sched_credit_domain_get(
>     return rc;
>  }
>
> -static int sched_credit_domain_set(
> -    int domid, libxl_sched_credit_domain *scinfo)
> +static int sched_credit_domain_set(int domid, libxl_sched_credit_domain 
> *scinfo)
>  {
>     int rc;
>
> @@ -3936,8 +3934,29 @@ static int sched_credit_domain_set(
>     return rc;
>  }
>
> -static int sched_credit_domain_output(
> -    int domid)
> +static int sched_credit_params_set(int poolid, libxl_sched_credit_params 
> *scinfo)
> +{
> +    int rc;
> +
> +    rc = libxl_sched_credit_params_set(ctx, poolid, scinfo);
> +    if (rc)
> +        fprintf(stderr, "libxl_sched_credit_params_set failed.\n");
> +
> +    return rc;
> +}
> +
> +static int sched_credit_params_get(int poolid, libxl_sched_credit_params 
> *scinfo)
> +{
> +    int rc;
> +
> +    rc = libxl_sched_credit_params_get(ctx, poolid, scinfo);
> +    if (rc)
> +        fprintf(stderr, "libxl_sched_credit_params_get failed.\n");
> +
> +    return rc;
> +}
> +
> +static int sched_credit_domain_output(int domid)
>  {
>     char *domname;
>     libxl_sched_credit_domain scinfo;
> @@ -3960,6 +3979,27 @@ static int sched_credit_domain_output(
>     return 0;
>  }
>
> +static int sched_credit_pool_output(uint32_t poolid)
> +{
> +    libxl_sched_credit_params scparam;
> +    char *poolname;
> +    int rc;
> +
> +    poolname = libxl_cpupoolid_to_name(ctx, poolid);
> +    rc = sched_credit_params_get(poolid, &scparam);
> +    if (rc) {
> +        printf("Cpupool %s: [sched params unavailable]\n",
> +               poolname);
> +    } else {
> +        printf("Cpupool %s: tslice=%dms ratelimit=%dus\n",
> +               poolname,
> +               scparam.tslice_ms,
> +               scparam.ratelimit_us);
> +    }
> +    free(poolname);
> +    return 0;
> +}
> +
>  static int sched_credit2_domain_get(
>     int domid, libxl_sched_credit2_domain *scinfo)
>  {
> @@ -4122,25 +4162,41 @@ static int sched_domain_output(uint32_t
>     return 0;
>  }
>
> +/*
> + * <nothing>             : List all domain params and sched params from all 
> pools
> + * -d [domid]            : List domain params for domain
> + * -d [domid] [params]   : Set domain params for domain
> + * -p [pool]             : list all domains and sched params for pool
> + * -s                    : List sched params for poolid 0
> + * -s [params]           : Set sched params for poolid 0
> + * -p [pool] -s          : List sched params for pool
> + * -p [pool] -s [params] : Set sched params for pool
> + * -p [pool] -d...       : Illegal
> + */
>  int main_sched_credit(int argc, char **argv)
>  {
>     libxl_sched_credit_domain scinfo;
>     const char *dom = NULL;
>     const char *cpupool = NULL;
>     int weight = 256, cap = 0, opt_w = 0, opt_c = 0;
> +    int opt_s = 0;
> +    int tslice = 0, opt_t = 0, ratelimit = 0, opt_r = 0;
>     int opt, rc;
>     int option_index = 0;
>     static struct option long_options[] = {
>         {"domain", 1, 0, 'd'},
>         {"weight", 1, 0, 'w'},
>         {"cap", 1, 0, 'c'},
> +        {"schedparam", 0, 0, 's'},
> +        {"tslice_ms", 1, 0, 't'},
> +        {"ratelimit_us", 1, 0, 'r'},
>         {"cpupool", 1, 0, 'p'},
>         {"help", 0, 0, 'h'},
>         {0, 0, 0, 0}
>     };
>
>     while (1) {
> -        opt = getopt_long(argc, argv, "d:w:c:p:h", long_options,
> +        opt = getopt_long(argc, argv, "d:w:c:p:t:r:hs", long_options,
>                           &option_index);
>         if (opt == -1)
>             break;
> @@ -4158,6 +4214,17 @@ int main_sched_credit(int argc, char **a
>             cap = strtol(optarg, NULL, 10);
>             opt_c = 1;
>             break;
> +        case 't':
> +            tslice = strtol(optarg, NULL, 10);
> +            opt_t = 1;
> +            break;
> +        case 'r':
> +            ratelimit = strtol(optarg, NULL, 10);
> +            opt_r = 1;
> +            break;
> +        case 's':
> +            opt_s = 1;
> +            break;
>         case 'p':
>             cpupool = optarg;
>             break;
> @@ -4167,20 +4234,54 @@ int main_sched_credit(int argc, char **a
>         }
>     }
>
> -    if (cpupool && (dom || opt_w || opt_c)) {
> -        fprintf(stderr, "Specifying a cpupool is not allowed with other "
> -                "options.\n");
> +    if ((cpupool || opt_s) && (dom || opt_w || opt_c)) {
> +        fprintf(stderr, "Specifying a cpupool or schedparam is not "
> +                "allowed with domain options.\n");
>         return 1;
>     }
>     if (!dom && (opt_w || opt_c)) {
>         fprintf(stderr, "Must specify a domain.\n");
>         return 1;
>     }
> -
> -    if (!dom) { /* list all domain's credit scheduler info */
> +    if (!opt_s && (opt_t || opt_r)) {
> +        fprintf(stderr, "Must specify schedparam to set schedule "
> +                "parameter values.\n");
> +        return 1;
> +    }
> +
> +    if (opt_s) {
> +        libxl_sched_credit_params  scparam;
> +        uint32_t poolid = 0;
> +
> +        if (cpupool) {
> +            if (cpupool_qualifier_to_cpupoolid(cpupool, &poolid, NULL) ||
> +                !libxl_cpupoolid_to_name(ctx, poolid)) {
> +                fprintf(stderr, "unknown cpupool \'%s\'\n", cpupool);
> +                return -ERROR_FAIL;
> +            }
> +        }
> +
> +        if (!opt_t && !opt_r) { /* Output scheduling parameters */
> +            return -sched_credit_pool_output(poolid);
> +        } else { /* Set scheduling parameters*/
> +            rc = sched_credit_params_get(poolid, &scparam);
> +            if (rc)
> +                return -rc;
> +
> +            if (opt_t)
> +                scparam.tslice_ms = tslice;
> +
> +            if (opt_r)
> +                scparam.ratelimit_us = ratelimit;
> +
> +            rc = sched_credit_params_set(poolid, &scparam);
> +            if (rc)
> +                return -rc;
> +        }
> +    } else if (!dom) { /* list all domain's credit scheduler info */
>         return -sched_domain_output(XEN_SCHEDULER_CREDIT,
>                                     sched_credit_domain_output,
> -                                    sched_default_pool_output,
> +                                    sched_credit_pool_output,
>                                     cpupool);
>     } else {
>         find_domain(dom);
> diff -r 5600db2bcd0e -r 0f91ce7b095a tools/libxl/xl_cmdtable.c
> --- a/tools/libxl/xl_cmdtable.c Wed Feb 22 16:08:28 2012 +0000
> +++ b/tools/libxl/xl_cmdtable.c Wed Feb 22 16:08:28 2012 +0000
> @@ -204,11 +204,14 @@ struct cmd_spec cmd_table[] = {
>     { "sched-credit",
>       &main_sched_credit, 0,
>       "Get/set credit scheduler parameters",
> -      "[-d <Domain> [-w[=WEIGHT]|-c[=CAP]]] [-p CPUPOOL]",
> -      "-d DOMAIN, --domain=DOMAIN     Domain to modify\n"
> -      "-w WEIGHT, --weight=WEIGHT     Weight (int)\n"
> -      "-c CAP, --cap=CAP              Cap (int)\n"
> -      "-p CPUPOOL, --cpupool=CPUPOOL  Restrict output to CPUPOOL"
> +      "[-d <Domain> [-w[=WEIGHT]|-c[=CAP]]] [-s [-t TSLICE] [-r RATELIMIT]] 
> [-p CPUPOOL]",
> +      "-d DOMAIN, --domain=DOMAIN        Domain to modify\n"
> +      "-w WEIGHT, --weight=WEIGHT        Weight (int)\n"
> +      "-c CAP, --cap=CAP                 Cap (int)\n"
> +      "-s         --schedparam           Query / modify scheduler 
> parameters\n"
> +      "-t TSLICE, --tslice_ms=TSLICE     Set the timeslice, in 
> milliseconds\n"
> +      "-r RLIMIT, --ratelimit_us=RLIMIT  Set the scheduling rate limit, in 
> microseconds\n"
> +      "-p CPUPOOL, --cpupool=CPUPOOL     Restrict output to CPUPOOL"
>     },
>     { "sched-credit2",
>       &main_sched_credit2, 0,
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.