[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 1/6] migration: Add multi-thread compress method
From: |
Markus Armbruster |
Subject: |
Re: [PATCH 1/6] migration: Add multi-thread compress method |
Date: |
Mon, 30 Nov 2020 09:35:25 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/27.1 (gnu/linux) |
Zeyu Jin <jinzeyu@huawei.com> writes:
> On 2020/11/27 17:48, Markus Armbruster wrote:
>> Kevin, Max, suggest to skip right to Qcow2CompressionType.
>>
>> Zeyu Jin <jinzeyu@huawei.com> writes:
>>
>>> A multi-thread compress method parameter is added to hold the method we
>>> are going to use. By default the 'zlib' method is used to maintain the
>>> compatibility as before.
>>>
>>> Signed-off-by: Zeyu Jin <jinzeyu@huawei.com>
>>> Signed-off-by: Ying Fang <fangying1@huawei.com>
>> [...]
>>> diff --git a/qapi/migration.json b/qapi/migration.json
>>> index 3c75820527..2ed6a55b92 100644
>>> --- a/qapi/migration.json
>>> +++ b/qapi/migration.json
>>> @@ -525,6 +525,19 @@
>>> 'data': [ 'none', 'zlib',
>>> { 'name': 'zstd', 'if': 'defined(CONFIG_ZSTD)' } ] }
>>>
>>> +##
>>> +# @CompressMethod:
>>> +#
>>> +# An enumeration of multi-thread compression methods.
>>> +#
>>> +# @zlib: use zlib compression method.
>>> +#
>>> +# Since: 6.0
>>> +#
>>> +##
>>> +{ 'enum': 'CompressMethod',
>>> + 'data': [ 'zlib' ] }
>>> +
>>> ##
>>> # @BitmapMigrationBitmapAlias:
>>> #
>>> @@ -599,6 +612,9 @@
>>> # compression, so set the decompress-threads to the
>>> number about 1/4
>>> # of compress-threads is adequate.
>>> #
>>> +# @compress-method: Set compression method to use in multi-thread
>>> compression.
>>> +# Defaults to zlib. (Since 6.0)
>>
>> We already have @multifd-compression. Why do we need to control the two
>> separately? Can you give a use case for different settings?
>>
>
> Generally, mulit-thread compression deals with the situation
> where network bandwith is limited but cpu resource is adequate. Multifd
> instead aims to situation where single fd cannot take full advantage of
> network bandwith. So compression based on multifd cannot fully cover the
> cases for multi-thread compression.
>
> For example, for migration with a bandwith limitation of 10M
> bytes/second, single fd is enough for data delivery. This is the case
> for multi-thread compression.
Let me rephrase my question.
According to query-migrate-parameters, we default to
"compress-level": 1
"compress-threads": 8
"compress-wait-thread": true
"decompress-threads": 2
"multifd-channels": 2
"multifd-compression": "none"
"multifd-zlib-level": 1
"multifd-zstd-level": 1
Your patch adds
"compress-method": "zlib"
I have several basic questions I can't answer from the documentation:
1. We appear to have two distinct sets of compression parameters:
* Traditional: compress-level, compress-threads,
compress-wait-thread, decompress-threads.
These parameters all apply to the same compression. Correct?
What data is being compressed by it?
* Multi-fd: multifd-channels, multifd-compression,
multifd-zlib-level, multifd-std-level
These parameters all apply to the same compression. Correct?
What data is being compressed by it?
* Why do we want *two*? I understand why multi-fd is optional, but
why do we need the capability to compress differently there? Use
case?
All of these questions predate your patch. David, Juan?
2. Does compress-method belong to "traditional"?
>> If we do want two parameters: the names @compress-method and
>> @multifd-compression are inconsistent. According to your comment,
>> @compress-method applies only to multi-thread compression. That leads
>> me to suggest renaming it to @multi-thread-compression.
>>
>
> For the names, my original idea is to make 'CompressMethod' consistent
> with other multi-thread compression parameters, like 'compress-threads'
> and 'compress-level'. There is truly some inconsistency here, between
> multifd-compression params and old multi-thread compression params.
I see.
> For now, I agree with you that 'multi-thread-compression' is better. It
> is more specific and clear. I will rename the params in next version.
> Thanks for the suggestion.
Please wait until we've sorted out the documentation mess.
>> After PATCH 4, CompressMethod is almost the same as MultiFDCompression:
>>
>> { 'enum': 'CompressMethod',
>> 'data': [ 'zlib' ] }
>> 'data': [ 'zlib', { 'name': 'zstd', 'if': 'defined(CONFIG_ZSTD)' } ] }
>>
>> { 'enum': 'MultiFDCompression',
>> 'data': [ 'none', 'zlib',
>> { 'name': 'zstd', 'if': 'defined(CONFIG_ZSTD)' } ] }
>>
>> The difference is member 'none'. Why does compression 'none' make sense
>> for multi-fd, but not for multi-thread?
>>
>
> When you set 'none'in multi-fd compression, you would not use the
> compression capability in multi-fd.
>
> In comparison, once you turn on multi-thread compression capability, you
> have already admitted to use compression. In this case, member 'none' is
> meaningless.
Let me rephrase my question:
How do you select zlib, zstd and no compression for "traditional"?
If zlib, how do you set the compression level (0 = none, 1 = fastest
compression, 9 = best compression)?
If zstd, how do you set the compression level (0 = none, 1 = fastest
compression, 20 = best compression)?
How do you select zlib, zstd and no compression for "multi-fd"?
If zlib, how do you set the compression level (0 = none, 1 = fastest
compression, 9 = best compression)?
If zstd, how do you set the compression level (0 = none, 1 = fastest
compression, 20 = best compression)?
>> If the difference is wanted: the names are inconsistent. Less of an
>> issue than member names, because type names are not externally visible.
>> Let's make them consistent anyway.
>>
>> Hmm, there's also Qcow2CompressionType. That's another conversation;
>> I'll start a new thread for it.
>>
>> [...]
>>
>> .
>>