[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
signature.asc
Description: OpenPGP digital signature
-- libvir-list mailing list [email protected] https://www.redhat.com/mailman/listinfo/libvir-list
