mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-08-27 19:11:16 +00:00
conf: Add IOThread quota and period scheduler/cputune defs
https://bugzilla.redhat.com/show_bug.cgi?id=1356937 Add the definitions to allow for viewing/setting cgroup period and quota limits for IOThreads. This is similar to the work done for emulator quota and period by commit ids 'b65dafa' and 'e051c482'. Being able to view/set the IOThread specific values is related to more recent changes adding global period (commmit id '4d92d58f') and global quota (commit id '55ecdae') definitions and qemu support (commit id '4e17ff79' and 'fbcbd1b2'). With a global setting though, if somehow the IOThread value in the cgroup hierarchy was set "outside of libvirt" to a value that is incompatible with the global value. Allowing control over IOThread specific values provides the capability to alter the IOThread values as necessary.
This commit is contained in:
parent
24555136bf
commit
2197ea56d7
@ -616,6 +616,8 @@
|
|||||||
<quota>-1</quota>
|
<quota>-1</quota>
|
||||||
<emulator_period>1000000</emulator_period>
|
<emulator_period>1000000</emulator_period>
|
||||||
<emulator_quota>-1</emulator_quota>
|
<emulator_quota>-1</emulator_quota>
|
||||||
|
<iothread_period>1000000</iothread_period>
|
||||||
|
<iothread_quota>-1</iothread_quota>
|
||||||
<vcpusched vcpus='0-4,^3' scheduler='fifo' priority='1'/>
|
<vcpusched vcpus='0-4,^3' scheduler='fifo' priority='1'/>
|
||||||
<iothreadsched iothreads='2' scheduler='batch'/>
|
<iothreadsched iothreads='2' scheduler='batch'/>
|
||||||
</cputune>
|
</cputune>
|
||||||
@ -720,6 +722,29 @@
|
|||||||
<span class="since">Only QEMU driver support since 0.10.0</span>
|
<span class="since">Only QEMU driver support since 0.10.0</span>
|
||||||
</dd>
|
</dd>
|
||||||
|
|
||||||
|
<dt><code>iothread_period</code></dt>
|
||||||
|
<dd>
|
||||||
|
The optional <code>iothread_period</code> element specifies the
|
||||||
|
enforcement interval(unit: microseconds) for IOThreads. Within
|
||||||
|
<code>iothread_period</code>, each IOThread of the domain will
|
||||||
|
not be allowed to consume more than <code>iothread_quota</code>
|
||||||
|
worth of runtime. The value should be in range [1000, 1000000].
|
||||||
|
An iothread_period with value 0 means no value.
|
||||||
|
<span class="since">Only QEMU driver support since 2.1.0</span>
|
||||||
|
</dd>
|
||||||
|
<dt><code>iothread_quota</code></dt>
|
||||||
|
<dd>
|
||||||
|
The optional <code>iothread_quota</code> element specifies the maximum
|
||||||
|
allowed bandwidth(unit: microseconds) for IOThreads. A domain with
|
||||||
|
<code>iothread_quota</code> as any negative value indicates that the
|
||||||
|
domain IOThreads have infinite bandwidth, which means that it is
|
||||||
|
not bandwidth controlled. The value should be in range
|
||||||
|
[1000, 18446744073709551] or less than 0. An <code>iothread_quota</code>
|
||||||
|
with value 0 means no value. You can use this feature to ensure that
|
||||||
|
all IOThreads run at the same speed.
|
||||||
|
<span class="since">Only QEMU driver support since 2.1.0</span>
|
||||||
|
</dd>
|
||||||
|
|
||||||
<dt><code>vcpusched</code> and <code>iothreadsched</code></dt>
|
<dt><code>vcpusched</code> and <code>iothreadsched</code></dt>
|
||||||
<dd>
|
<dd>
|
||||||
The optional <code>vcpusched</code> elements specifies the scheduler
|
The optional <code>vcpusched</code> elements specifies the scheduler
|
||||||
|
@ -731,6 +731,16 @@
|
|||||||
<ref name="cpuquota"/>
|
<ref name="cpuquota"/>
|
||||||
</element>
|
</element>
|
||||||
</optional>
|
</optional>
|
||||||
|
<optional>
|
||||||
|
<element name="iothread_period">
|
||||||
|
<ref name="cpuperiod"/>
|
||||||
|
</element>
|
||||||
|
</optional>
|
||||||
|
<optional>
|
||||||
|
<element name="iothread_quota">
|
||||||
|
<ref name="cpuquota"/>
|
||||||
|
</element>
|
||||||
|
</optional>
|
||||||
<zeroOrMore>
|
<zeroOrMore>
|
||||||
<element name="vcpupin">
|
<element name="vcpupin">
|
||||||
<attribute name="vcpu">
|
<attribute name="vcpu">
|
||||||
|
@ -364,6 +364,22 @@ typedef enum {
|
|||||||
*/
|
*/
|
||||||
# define VIR_DOMAIN_SCHEDULER_EMULATOR_QUOTA "emulator_quota"
|
# define VIR_DOMAIN_SCHEDULER_EMULATOR_QUOTA "emulator_quota"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* VIR_DOMAIN_SCHEDULER_IOTHREAD_PERIOD:
|
||||||
|
*
|
||||||
|
* Macro represents the enforcement period for a quota, in microseconds,
|
||||||
|
* for IOThreads only, when using the posix scheduler, as a ullong.
|
||||||
|
*/
|
||||||
|
# define VIR_DOMAIN_SCHEDULER_IOTHREAD_PERIOD "iothread_period"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* VIR_DOMAIN_SCHEDULER_IOTHREAD_QUOTA:
|
||||||
|
*
|
||||||
|
* Macro represents the maximum bandwidth to be used within a period for
|
||||||
|
* IOThreads only, when using the posix scheduler, as an llong.
|
||||||
|
*/
|
||||||
|
# define VIR_DOMAIN_SCHEDULER_IOTHREAD_QUOTA "iothread_quota"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* VIR_DOMAIN_SCHEDULER_WEIGHT:
|
* VIR_DOMAIN_SCHEDULER_WEIGHT:
|
||||||
*
|
*
|
||||||
@ -3612,6 +3628,22 @@ typedef void (*virConnectDomainEventJobCompletedCallback)(virConnectPtr conn,
|
|||||||
*/
|
*/
|
||||||
# define VIR_DOMAIN_TUNABLE_CPU_EMULATOR_QUOTA "cputune.emulator_quota"
|
# define VIR_DOMAIN_TUNABLE_CPU_EMULATOR_QUOTA "cputune.emulator_quota"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* VIR_DOMAIN_TUNABLE_CPU_IOTHREAD_PERIOD:
|
||||||
|
*
|
||||||
|
* Macro represents the enforcement period for a quota, in microseconds, for
|
||||||
|
* iothreads only, when using the posix scheduler, as VIR_TYPED_PARAM_ULLONG.
|
||||||
|
*/
|
||||||
|
# define VIR_DOMAIN_TUNABLE_CPU_IOTHREAD_PERIOD "cputune.iothread_period"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* VIR_DOMAIN_TUNABLE_CPU_IOTHREAD_QUOTA:
|
||||||
|
*
|
||||||
|
* Macro represents the maximum bandwidth to be used within a period for
|
||||||
|
* iothreads only, when using the posix scheduler, as VIR_TYPED_PARAM_LLONG.
|
||||||
|
*/
|
||||||
|
# define VIR_DOMAIN_TUNABLE_CPU_IOTHREAD_QUOTA "cputune.iothread_quota"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* VIR_DOMAIN_TUNABLE_BLKDEV_DISK:
|
* VIR_DOMAIN_TUNABLE_BLKDEV_DISK:
|
||||||
*
|
*
|
||||||
|
@ -16131,6 +16131,38 @@ virDomainDefParseXML(xmlDocPtr xml,
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (virXPathULongLong("string(./cputune/iothread_period[1])", ctxt,
|
||||||
|
&def->cputune.iothread_period) < -1) {
|
||||||
|
virReportError(VIR_ERR_XML_ERROR, "%s",
|
||||||
|
_("can't parse cputune iothread period value"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (def->cputune.iothread_period > 0 &&
|
||||||
|
(def->cputune.iothread_period < 1000 ||
|
||||||
|
def->cputune.iothread_period > 1000000)) {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
|
_("Value of cputune iothread_period must be in range "
|
||||||
|
"[1000, 1000000]"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (virXPathLongLong("string(./cputune/iothread_quota[1])", ctxt,
|
||||||
|
&def->cputune.iothread_quota) < -1) {
|
||||||
|
virReportError(VIR_ERR_XML_ERROR, "%s",
|
||||||
|
_("can't parse cputune iothread quota value"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (def->cputune.iothread_quota > 0 &&
|
||||||
|
(def->cputune.iothread_quota < 1000 ||
|
||||||
|
def->cputune.iothread_quota > 18446744073709551LL)) {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
|
_("Value of cputune iothread_quota must be in range "
|
||||||
|
"[1000, 18446744073709551]"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
if ((n = virXPathNodeSet("./cputune/vcpupin", ctxt, &nodes)) < 0)
|
if ((n = virXPathNodeSet("./cputune/vcpupin", ctxt, &nodes)) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
@ -22812,6 +22844,16 @@ virDomainCputuneDefFormat(virBufferPtr buf,
|
|||||||
"</emulator_quota>\n",
|
"</emulator_quota>\n",
|
||||||
def->cputune.emulator_quota);
|
def->cputune.emulator_quota);
|
||||||
|
|
||||||
|
if (def->cputune.iothread_period)
|
||||||
|
virBufferAsprintf(&childrenBuf, "<iothread_period>%llu"
|
||||||
|
"</iothread_period>\n",
|
||||||
|
def->cputune.iothread_period);
|
||||||
|
|
||||||
|
if (def->cputune.iothread_quota)
|
||||||
|
virBufferAsprintf(&childrenBuf, "<iothread_quota>%lld"
|
||||||
|
"</iothread_quota>\n",
|
||||||
|
def->cputune.iothread_quota);
|
||||||
|
|
||||||
for (i = 0; i < def->maxvcpus; i++) {
|
for (i = 0; i < def->maxvcpus; i++) {
|
||||||
char *cpumask;
|
char *cpumask;
|
||||||
virDomainVcpuDefPtr vcpu = def->vcpus[i];
|
virDomainVcpuDefPtr vcpu = def->vcpus[i];
|
||||||
|
@ -2033,6 +2033,8 @@ struct _virDomainCputune {
|
|||||||
long long global_quota;
|
long long global_quota;
|
||||||
unsigned long long emulator_period;
|
unsigned long long emulator_period;
|
||||||
long long emulator_quota;
|
long long emulator_quota;
|
||||||
|
unsigned long long iothread_period;
|
||||||
|
long long iothread_quota;
|
||||||
virBitmapPtr emulatorpin;
|
virBitmapPtr emulatorpin;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -10,6 +10,8 @@
|
|||||||
<quota>-1</quota>
|
<quota>-1</quota>
|
||||||
<global_period>1000000</global_period>
|
<global_period>1000000</global_period>
|
||||||
<global_quota>-1</global_quota>
|
<global_quota>-1</global_quota>
|
||||||
|
<iothread_period>1000000</iothread_period>
|
||||||
|
<iothread_quota>-1</iothread_quota>
|
||||||
<vcpupin vcpu='0' cpuset='0'/>
|
<vcpupin vcpu='0' cpuset='0'/>
|
||||||
<vcpupin vcpu='1' cpuset='1'/>
|
<vcpupin vcpu='1' cpuset='1'/>
|
||||||
<emulatorpin cpuset='1'/>
|
<emulatorpin cpuset='1'/>
|
||||||
|
@ -10,6 +10,8 @@
|
|||||||
<quota>-1</quota>
|
<quota>-1</quota>
|
||||||
<global_period>1000000</global_period>
|
<global_period>1000000</global_period>
|
||||||
<global_quota>-1</global_quota>
|
<global_quota>-1</global_quota>
|
||||||
|
<iothread_period>1000000</iothread_period>
|
||||||
|
<iothread_quota>-1</iothread_quota>
|
||||||
<vcpupin vcpu='0' cpuset='0'/>
|
<vcpupin vcpu='0' cpuset='0'/>
|
||||||
<vcpupin vcpu='1' cpuset='1'/>
|
<vcpupin vcpu='1' cpuset='1'/>
|
||||||
<emulatorpin cpuset='1'/>
|
<emulatorpin cpuset='1'/>
|
||||||
|
@ -1937,7 +1937,7 @@ available for each hypervisor are:
|
|||||||
LXC (posix scheduler) : cpu_shares, vcpu_period, vcpu_quota
|
LXC (posix scheduler) : cpu_shares, vcpu_period, vcpu_quota
|
||||||
|
|
||||||
QEMU/KVM (posix scheduler): cpu_shares, vcpu_period, vcpu_quota,
|
QEMU/KVM (posix scheduler): cpu_shares, vcpu_period, vcpu_quota,
|
||||||
emulator_period, emulator_quota
|
emulator_period, emulator_quota, iothread_quota, iothread_period
|
||||||
|
|
||||||
Xen (credit scheduler): weight, cap
|
Xen (credit scheduler): weight, cap
|
||||||
|
|
||||||
@ -1955,9 +1955,10 @@ values 0 and 1 are automatically converted to a minimal value of 2.
|
|||||||
B<Note>: The weight and cap parameters are defined only for the
|
B<Note>: The weight and cap parameters are defined only for the
|
||||||
XEN_CREDIT scheduler and are now I<DEPRECATED>.
|
XEN_CREDIT scheduler and are now I<DEPRECATED>.
|
||||||
|
|
||||||
B<Note>: The vcpu_period/emulator_period parameters have a valid value range
|
B<Note>: The vcpu_period, emulator_period, and iothread_period parameters
|
||||||
of 1000-1000000 or 0, and the vcpu_quota/emulator_quota parameters have a
|
have a valid value range of 1000-1000000 or 0, and the vcpu_quota,
|
||||||
valid value range of 1000-18446744073709551 or less than 0. The value 0 for
|
emulator_quota, and iothread_quota parameters have a valid value range of
|
||||||
|
1000-18446744073709551 or less than 0. The value 0 for
|
||||||
either parameter is the same as not specifying that parameter.
|
either parameter is the same as not specifying that parameter.
|
||||||
|
|
||||||
=item B<screenshot> I<domain> [I<imagefilepath>] [I<--screen> B<screenID>]
|
=item B<screenshot> I<domain> [I<imagefilepath>] [I<--screen> B<screenID>]
|
||||||
|
Loading…
Reference in New Issue
Block a user