|
[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |