[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

Attachment: signature.asc
Description: OpenPGP digital signature

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to