Re: [libvirt] [PATCH v2.1 19/21] qemu: introduce period/quota tuning for emulator
On Tue, Aug 21, 2012 at 05:18:42PM +0800, Hu Tao wrote: This patch introduces support of setting emulator's period and quota to limit cpu bandwidth when the vm starts. Also updates XML Schema for new entries and docs. --- docs/formatdomain.html.in | 24 docs/schemas/domaincommon.rng | 10 ++ src/conf/domain_conf.c| 25 +++-- src/conf/domain_conf.h|2 ++ src/qemu/qemu_cgroup.c| 11 ++- 5 files changed, 69 insertions(+), 3 deletions(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 81ec2cd..6142f4b 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -388,6 +388,8 @@ lt;sharesgt;2048lt;/sharesgt; lt;periodgt;100lt;/periodgt; lt;quotagt;-1lt;/quotagt; +lt;emulator_periodgt;100lt;/periodgt; +lt;emulator_quotagt;-1lt;/quotagt; lt;/cputunegt; ... lt;/domaingt; @@ -451,6 +453,28 @@ span class=sinceOnly QEMU driver support since 0.9.4, LXC since 0.9.10/span /dd + + dtcodeemulator_period/code/dt + dd +The optional codeemulator_period/code element specifies the enforcement +interval(unit: microseconds). Within codeemulator_period/code, emulator +threads(those excluding vcpus) of the domain will not be allowed to consume +more than codeemulator_quota/code worth of runtime. The value should be +in range [1000, 100]. A period with value 0 means no value. +span class=sinceOnly QEMU driver support since 0.10.0/span + /dd + dtcodeemulator_quota/code/dt + dd +The optional codeemulator_quota/code element specifies the maximum +allowed bandwidth(unit: microseconds) for domain's emulator threads(those +excluding vcpus). A domain with codeemulator_quota/code as any negative +value indicates that the domain has infinite bandwidth for emulator threads +(those excluding vcpus), which means that it is not bandwidth controlled. +The value should be in range [1000, 18446744073709551] or less than 0. A +quota with value 0 means no value. +span class=sinceOnly QEMU driver support since 0.10.0/span + /dd + /dl diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index b02ad96..7aa6e47 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -581,6 +581,16 @@ ref name=cpuquota/ /element /optional + optional +element name=emulator_period + ref name=cpuperiod/ +/element + /optional + optional +element name=emulator_quota + ref name=cpuquota/ +/element + /optional zeroOrMore element name=vcpupin attribute name=vcpu diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index dab9c5d..7bb07b4 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -8297,6 +8297,14 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, def-cputune.quota) 0) def-cputune.quota = 0; +if (virXPathULongLong(string(./cputune/emulator_period[1]), ctxt, + def-cputune.emulator_period) 0) +def-cputune.emulator_period = 0; + +if (virXPathLongLong(string(./cputune/emulator_quota[1]), ctxt, + def-cputune.emulator_quota) 0) +def-cputune.emulator_quota = 0; + if ((n = virXPathNodeSet(./cputune/vcpupin, ctxt, nodes)) 0) { goto error; } @@ -13030,7 +13038,8 @@ virDomainDefFormatInternal(virDomainDefPtr def, if (def-cputune.shares || def-cputune.vcpupin || def-cputune.period || def-cputune.quota || -def-cputune.emulatorpin) +def-cputune.emulatorpin || +def-cputune.emulator_period || def-cputune.emulator_quota) virBufferAddLit(buf, cputune\n); if (def-cputune.shares) @@ -13042,6 +13051,17 @@ virDomainDefFormatInternal(virDomainDefPtr def, if (def-cputune.quota) virBufferAsprintf(buf, quota%lld/quota\n, def-cputune.quota); + +if (def-cputune.emulator_period) +virBufferAsprintf(buf, emulator_period%llu + /emulator_period\n, + def-cputune.emulator_period); + +if (def-cputune.emulator_quota) +virBufferAsprintf(buf, emulator_quota%lld + /emulator_quota\n, + def-cputune.emulator_quota); + if (def-cputune.vcpupin) { for (i = 0; i def-cputune.nvcpupin; i++) { virBufferAsprintf(buf, vcpupin vcpu='%u' , @@ -13080,7 +13100,8 @@
[libvirt] [PATCH v2.1 19/21] qemu: introduce period/quota tuning for emulator
This patch introduces support of setting emulator's period and quota to limit cpu bandwidth when the vm starts. Also updates XML Schema for new entries and docs. --- docs/formatdomain.html.in | 24 docs/schemas/domaincommon.rng | 10 ++ src/conf/domain_conf.c| 25 +++-- src/conf/domain_conf.h|2 ++ src/qemu/qemu_cgroup.c| 11 ++- 5 files changed, 69 insertions(+), 3 deletions(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 81ec2cd..6142f4b 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -388,6 +388,8 @@ lt;sharesgt;2048lt;/sharesgt; lt;periodgt;100lt;/periodgt; lt;quotagt;-1lt;/quotagt; +lt;emulator_periodgt;100lt;/periodgt; +lt;emulator_quotagt;-1lt;/quotagt; lt;/cputunegt; ... lt;/domaingt; @@ -451,6 +453,28 @@ span class=sinceOnly QEMU driver support since 0.9.4, LXC since 0.9.10/span /dd + + dtcodeemulator_period/code/dt + dd +The optional codeemulator_period/code element specifies the enforcement +interval(unit: microseconds). Within codeemulator_period/code, emulator +threads(those excluding vcpus) of the domain will not be allowed to consume +more than codeemulator_quota/code worth of runtime. The value should be +in range [1000, 100]. A period with value 0 means no value. +span class=sinceOnly QEMU driver support since 0.10.0/span + /dd + dtcodeemulator_quota/code/dt + dd +The optional codeemulator_quota/code element specifies the maximum +allowed bandwidth(unit: microseconds) for domain's emulator threads(those +excluding vcpus). A domain with codeemulator_quota/code as any negative +value indicates that the domain has infinite bandwidth for emulator threads +(those excluding vcpus), which means that it is not bandwidth controlled. +The value should be in range [1000, 18446744073709551] or less than 0. A +quota with value 0 means no value. +span class=sinceOnly QEMU driver support since 0.10.0/span + /dd + /dl diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index b02ad96..7aa6e47 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -581,6 +581,16 @@ ref name=cpuquota/ /element /optional + optional +element name=emulator_period + ref name=cpuperiod/ +/element + /optional + optional +element name=emulator_quota + ref name=cpuquota/ +/element + /optional zeroOrMore element name=vcpupin attribute name=vcpu diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index dab9c5d..7bb07b4 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -8297,6 +8297,14 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, def-cputune.quota) 0) def-cputune.quota = 0; +if (virXPathULongLong(string(./cputune/emulator_period[1]), ctxt, + def-cputune.emulator_period) 0) +def-cputune.emulator_period = 0; + +if (virXPathLongLong(string(./cputune/emulator_quota[1]), ctxt, + def-cputune.emulator_quota) 0) +def-cputune.emulator_quota = 0; + if ((n = virXPathNodeSet(./cputune/vcpupin, ctxt, nodes)) 0) { goto error; } @@ -13030,7 +13038,8 @@ virDomainDefFormatInternal(virDomainDefPtr def, if (def-cputune.shares || def-cputune.vcpupin || def-cputune.period || def-cputune.quota || -def-cputune.emulatorpin) +def-cputune.emulatorpin || +def-cputune.emulator_period || def-cputune.emulator_quota) virBufferAddLit(buf, cputune\n); if (def-cputune.shares) @@ -13042,6 +13051,17 @@ virDomainDefFormatInternal(virDomainDefPtr def, if (def-cputune.quota) virBufferAsprintf(buf, quota%lld/quota\n, def-cputune.quota); + +if (def-cputune.emulator_period) +virBufferAsprintf(buf, emulator_period%llu + /emulator_period\n, + def-cputune.emulator_period); + +if (def-cputune.emulator_quota) +virBufferAsprintf(buf, emulator_quota%lld + /emulator_quota\n, + def-cputune.emulator_quota); + if (def-cputune.vcpupin) { for (i = 0; i def-cputune.nvcpupin; i++) { virBufferAsprintf(buf, vcpupin vcpu='%u' , @@ -13080,7 +13100,8 @@ virDomainDefFormatInternal(virDomainDefPtr def, if (def-cputune.shares || def-cputune.vcpupin || def-cputune.period || def-cputune.quota || -def-cputune.emulatorpin) +