[correcting list address: libvirt-list, not libver-list]
On 06/02/2015 05:58 AM, Feng, Shaohe wrote:
Hi folks:
I'd like to request some comments on enabling multi-thread compression in libvirt.
Currently, qemu upstream has supported multi-thread compression for live migration.
$ git log 263170e~1..362ba4e -oneline
This can preserve bandwidth and speed up the live migration process, so this is an
import
feature we need to enable so for other high level such as openstack will be benefit.
We plan to add feature of multi-thread compression and actually the patch is working in
process.
Now some things need for comments.
1. Expose new set/get multi-thread compression parameters API for live migration.
Now qemu only supports zlib compression. Maybe LZ4 and gzip will be supported later.
but there are 3 parameters needed by qemu currently.
"compress-level": compression level, default is 1. For zlib compression, it is
from 0-9, 0 means use default level, 9 means high compressed.
"compress-threads": compression thread count for multi-thread migration,
default is 8 in qemu.
"decompress-threads": decompression thread count for multi-thread migration,
default is 2 in qemu
So in libvirt we will expose the public symbols as follow, we only 3 parameters,
missing compression method(zlib, LZ4 and gzip) parameters, for qemu do not support it at
present.
index d851225..103b3b9 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -798,6 +798,17 @@ int virDomainMigrateGetMaxSpeed(virDomainPtr domain,
unsigned long *bandwidth,
unsigned int flags);
+int virdomainMigrateSetParameters(virDomainPtr domain,
+ int level,
+ int threads,
+ int dthreads,
+ int flags)
+int virdomainMigrateGetParameters(virDomainPtr domain,
+ int *level,
+ int *threads,
+ int *dthreads,
+ int flags)
+
I'd rather we used virTypedParameters, to make it easier to use the same
API to pass ALL future possible tuning parameters, rather than just
hard-coding to only the parameters of this one feature.
For virdomainMigrateSetParameters, if specifying a negative value to level, threads, and
dthreads parameters, such as -1,
means do not set the parameters.
The underlying code will not pass the corresponding parameters to qemu monitor.
Such as threads and dthreads is -1, then pass the following json streaming to qemu.
{ "execute": "migrate-set-parameters" , "arguments": {
"compress-level": 1 } }
The virsh will expose the two commands:
# virsh migrate-setparameters <domain> [--level level] [--threads threads]
[--dthreads dthread]
# virsh migrate-getparameters <domain>
2. How to enable multi-thread compression in application interface?
There is not a special interface for setting migration capabilities.
But we can set the capabilities when execute an virsh command as following:
$ migrate --live] [--offline] [--p2p] [--direct] [--tunnelled] [--persistent]
[--undefinesource] [--suspend] [--copy-storage-all] [--copy-storage-inc]
[--change-protection] [--unsafe] [--verbose] [--compressed] [--abort-on-error]
<domain> <desturi> [<migrateuri>] [<graphicsuri>]
[<listen-address>] [<dname>] [--timeout <number>] [--xml
<string>]
There is already a "compressed" option, here "compressed" means
"xbzrle" not "multi- compressed".
can I rename the "compressed" to "xbzrle"?
If we think that it is worth always turning on both compression styles
simultaneously, then reuse the bit. Otherwise, we need a different bit,
and users can choose which (or both) of the two compression styles as
desired.
so we add another option for multi-thread compression, which is
better option name? "-multi- compressed" ?
Any way this is confuse to user. We need to
distinguish<http://dict.youdao.com/w/distinguish/> these two.
So I wonder should we expose new API to enable the migrate multi-thread compress.
+int virdomainMigrateEnableMultiThreadCompress (virDomainPtr domain, int flags)
It will pass the following command to qemu monitor.
{ "execute": "migrate-set-capabilities" , "arguments": {
"capabilities": [ { "capability": " compress",
"state": true } ] } }
NOTE: Now, multiple thread compression can co-work with xbzrle. When xbzrle is on,
multiple thread compression will only work at the first round of RAM data sync.
Qemu, $ git show 98f1138902195bd9ab8a753d0ee2cf2a0a88b6e8
if compress and xbzrle are both on, compress only takes effect in the ram bulk stage,
after that, it will be disabled and only xbzrle takes effect, this can help to minimize
migration traffic.
3. Migration between different livirt/qemu version
We can support to expose 2 new API to set/get migrate capabilities.
+ virdomainMigrateSetCapabilities
+ virdomainMigrateGetCapabilities
And we can suggest the user application to probe the capabilities before execute live
migration in our doc.
This need discussion is it necessary support these two in libvirt?
Without the above GetCapabilities API, user application can probe multi-thread compress
capabilities by virdomainMigrateGetParameters.
Or
return error directly when user application execute live migration with multi-thread flag
specifying, but do not any Capabilities probe.
INFO: qmeu command
{"execute": "query-migrate-capabilities"}
{"return": [{"state": false, "capability":
"xbzrle"}, {"state": false, "capability":
"rdma-pin-all"}, {"state": false, "capability":
"auto-converge"}, {"state": false, "capability":
"zero-blocks"}, {"state": false, "capability":
"compress"}]}
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library
http://libvirt.org