> On Mar 28, 2024, at 12:23 AM, Liu, Yuan1 <yuan1....@intel.com> wrote:
>
>> -----Original Message-----
>> From: Bryan Zhang <bryan.zh...@bytedance.com>
>> Sent: Wednesday, March 27, 2024 6:42 AM
>> To: qemu-devel@nongnu.org
>> Cc: pet...@redhat.com; faro...@suse.de; Liu, Yuan1 <yuan1....@intel.com>;
>> berra...@redhat.com; Zou, Nanhai <nanhai....@intel.com>;
>> hao.xi...@linux.dev; Bryan Zhang <bryan.zh...@bytedance.com>
>> Subject: [PATCH v2 2/5] migration: Add migration parameters for QATzip
>>
>> Adds support for migration parameters to control QATzip compression
>> level and to enable/disable software fallback when QAT hardware is
>> unavailable. This is a preparatory commit for a subsequent commit that
>> will actually use QATzip compression.
>>
>> Signed-off-by: Bryan Zhang <bryan.zh...@bytedance.com>
>> Signed-off-by: Hao Xiang <hao.xi...@linux.dev>
>> ---
>> Revision: This commit now includes a parameter for controlling software
>> fallback. Fallback is generally intended to be disabled, but having this
>> option available enables using software fallback for testing.
>>
>> This commit also now has some glue code to properly set parameters.
>>
>> migration/migration-hmp-cmds.c | 8 +++++
>> migration/options.c | 57 ++++++++++++++++++++++++++++++++++
>> migration/options.h | 2 ++
>> qapi/migration.json | 35 +++++++++++++++++++++
>> 4 files changed, 102 insertions(+)
>>
>> diff --git a/migration/migration-hmp-cmds.c b/migration/migration-hmp-
>> cmds.c
>> index 99b49df5dd..4bd23ba14d 100644
>> --- a/migration/migration-hmp-cmds.c
>> +++ b/migration/migration-hmp-cmds.c
>> @@ -630,6 +630,14 @@ void hmp_migrate_set_parameter(Monitor *mon, const
>> QDict *qdict)
>> p->has_multifd_zlib_level = true;
>> visit_type_uint8(v, param, &p->multifd_zlib_level, &err);
>> break;
>> + case MIGRATION_PARAMETER_MULTIFD_QATZIP_LEVEL:
>> + p->has_multifd_qatzip_level = true;
>> + visit_type_uint8(v, param, &p->multifd_qatzip_level, &err);
>> + break;
>> + case MIGRATION_PARAMETER_MULTIFD_QATZIP_SW_FALLBACK:
>> + p->has_multifd_qatzip_sw_fallback = true;
>> + visit_type_bool(v, param, &p->multifd_qatzip_sw_fallback, &err);
>> + break;
>> case MIGRATION_PARAMETER_MULTIFD_ZSTD_LEVEL:
>> p->has_multifd_zstd_level = true;
>> visit_type_uint8(v, param, &p->multifd_zstd_level, &err);
>> diff --git a/migration/options.c b/migration/options.c
>> index 3e3e0b93b4..1316ea605a 100644
>> --- a/migration/options.c
>> +++ b/migration/options.c
>> @@ -62,6 +62,15 @@
>> #define DEFAULT_MIGRATE_MULTIFD_COMPRESSION MULTIFD_COMPRESSION_NONE
>> /* 0: means nocompress, 1: best speed, ... 9: best compress ratio */
>> #define DEFAULT_MIGRATE_MULTIFD_ZLIB_LEVEL 1
>> +/*
>> + * 1: best speed, ... 9: best compress ratio
>> + * There is some nuance here. Refer to QATzip documentation to understand
>> + * the mapping of QATzip levels to standard deflate levels.
>> + */
>> +#define DEFAULT_MIGRATE_MULTIFD_QATZIP_LEVEL 1
>> +/* QATzip's SW fallback implementation is extremely slow, so avoid
>> fallback */
>> +#define DEFAULT_MIGRATE_MULTIFD_QATZIP_SW_FALLBACK false
>> +
>> /* 0: means nocompress, 1: best speed, ... 20: best compress ratio */
>> #define DEFAULT_MIGRATE_MULTIFD_ZSTD_LEVEL 1
>
> Hi Bryan
>
> The default compression level may be set higher, such as 6. I checked QAT
> throughput
> If the data size is less than or equal to 64K, level 1 has much better
> throughput
> performance than level 6 and level 9. But if the data size is greater than
> 128K, little
> change in throughput, and the default MULTIFD_PACKET_SIZE is 512K, you can
> have a try
> to use a high compression level, to get better compression performance
> without affecting
> throughput.
>
> In addition, if you change MULTIFD_PACKET_SIZE to 64K, you may have better
> throughput
> with more multifd threads
Hi Yuan,
Thanks for your comment. I did a quick experiments on our CPU. With chunk size
at 512K, for silesia dataset, the throughput degrades at level 6:
# for f in `seq 1 1 9`; do echo "Level $f:"; qzip -C 524288 -L $f -k silesia.8G
| grep ":"; done
Level 1:
Time taken: 2230.772 ms
Throughput: 30402.186 Mbit/s
Space Savings: 65.712 %
Compression ratio: 2.916 : 1
Level 2:
Time taken: 2245.205 ms
Throughput: 30206.750 Mbit/s
Space Savings: 65.712 %
Compression ratio: 2.916 : 1
Level 3:
Time taken: 2217.789 ms
Throughput: 30580.161 Mbit/s
Space Savings: 65.712 %
Compression ratio: 2.916 : 1
Level 4:
Time taken: 2251.014 ms
Throughput: 30128.798 Mbit/s
Space Savings: 65.712 %
Compression ratio: 2.916 : 1
Level 5:
Time taken: 2200.991 ms
Throughput: 30813.550 Mbit/s
Space Savings: 65.712 %
Compression ratio: 2.916 : 1
Level 6:
Time taken: 2508.218 ms
Throughput: 27039.255 Mbit/s
Space Savings: 67.396 %
Compression ratio: 3.067 : 1
Level 7:
Time taken: 2510.847 ms
Throughput: 27010.943 Mbit/s
Space Savings: 67.396 %
Compression ratio: 3.067 : 1
Level 8:
Time taken: 2521.428 ms
Throughput: 26897.594 Mbit/s
Space Savings: 67.396 %
Compression ratio: 3.067 : 1
Level 9:
Time taken: 3071.055 ms
Throughput: 22083.729 Mbit/s
Space Savings: 67.664 %
Compression ratio: 3.092 : 1
For random text data, throughput actually improves at level 6.
# for f in `seq 1 1 9`; do echo "Level $f:"; qzip -C 524288 -L $f -k text.txt |
grep ":"; done
Level 1:
Time taken: 1788.683 ms
Throughput: 8945.129 Mbit/s
Space Savings: 24.959 %
Compression ratio: 1.333 : 1
Level 2:
Time taken: 1786.135 ms
Throughput: 8957.890 Mbit/s
Space Savings: 24.959 %
Compression ratio: 1.333 : 1
Level 3:
Time taken: 1785.564 ms
Throughput: 8960.754 Mbit/s
Space Savings: 24.959 %
Compression ratio: 1.333 : 1
Level 4:
Time taken: 1787.351 ms
Throughput: 8951.795 Mbit/s
Space Savings: 24.959 %
Compression ratio: 1.333 : 1
Level 5:
Time taken: 1785.171 ms
Throughput: 8962.727 Mbit/s
Space Savings: 24.959 %
Compression ratio: 1.333 : 1
Level 6:
Time taken: 1752.000 ms
Throughput: 9132.420 Mbit/s
Space Savings: 24.873 %
Compression ratio: 1.331 : 1
Level 7:
Time taken: 1752.297 ms
Throughput: 9130.872 Mbit/s
Space Savings: 24.873 %
Compression ratio: 1.331 : 1
Level 8:
Time taken: 1752.538 ms
Throughput: 9129.617 Mbit/s
Space Savings: 24.873 %
Compression ratio: 1.331 : 1
Level 9:
Time taken: 1762.593 ms
Throughput: 9077.535 Mbit/s
Space Savings: 24.870 %
Compression ratio: 1.331 : 1
For random binary data, throughput remains the same from 0-9.
Given our live migration is mostly memory pages, and I am not very sure what
scenario would better fit to above tests. I am OK with either default level (1
or 6). I can change to 6 in my next patchiest if you believe that is better.
Thanks very much!
Regards,
Yichen
>
>> @@ -143,6 +152,12 @@ Property migration_properties[] = {
>> DEFINE_PROP_UINT8("multifd-zlib-level", MigrationState,
>> parameters.multifd_zlib_level,
>> DEFAULT_MIGRATE_MULTIFD_ZLIB_LEVEL),
>> + DEFINE_PROP_UINT8("multifd-qatzip-level", MigrationState,
>> + parameters.multifd_qatzip_level,
>> + DEFAULT_MIGRATE_MULTIFD_QATZIP_LEVEL),
>> + DEFINE_PROP_BOOL("multifd-qatzip-sw-fallback", MigrationState,
>> + parameters.multifd_qatzip_sw_fallback,
>> + DEFAULT_MIGRATE_MULTIFD_QATZIP_SW_FALLBACK),
>> DEFINE_PROP_UINT8("multifd-zstd-level", MigrationState,
>> parameters.multifd_zstd_level,
>> DEFAULT_MIGRATE_MULTIFD_ZSTD_LEVEL),
>> @@ -861,6 +876,20 @@ int migrate_multifd_zlib_level(void)
>> return s->parameters.multifd_zlib_level;
>> }
>>
>> +int migrate_multifd_qatzip_level(void)
>> +{
>> + MigrationState *s = migrate_get_current();
>> +
>> + return s->parameters.multifd_qatzip_level;
>> +}
>> +
>> +bool migrate_multifd_qatzip_sw_fallback(void)
>> +{
>> + MigrationState *s = migrate_get_current();
>> +
>> + return s->parameters.multifd_qatzip_sw_fallback;
>> +}
>> +
>> int migrate_multifd_zstd_level(void)
>> {
>> MigrationState *s = migrate_get_current();
>> @@ -983,6 +1012,11 @@ MigrationParameters
>> *qmp_query_migrate_parameters(Error **errp)
>> params->multifd_compression = s->parameters.multifd_compression;
>> params->has_multifd_zlib_level = true;
>> params->multifd_zlib_level = s->parameters.multifd_zlib_level;
>> + params->has_multifd_qatzip_level = true;
>> + params->multifd_qatzip_level = s->parameters.multifd_qatzip_level;
>> + params->has_multifd_qatzip_sw_fallback = true;
>> + params->multifd_qatzip_sw_fallback =
>> + s->parameters.multifd_qatzip_sw_fallback;
>> params->has_multifd_zstd_level = true;
>> params->multifd_zstd_level = s->parameters.multifd_zstd_level;
>> params->has_xbzrle_cache_size = true;
>> @@ -1038,6 +1072,8 @@ void migrate_params_init(MigrationParameters
>> *params)
>> params->has_multifd_channels = true;
>> params->has_multifd_compression = true;
>> params->has_multifd_zlib_level = true;
>> + params->has_multifd_qatzip_level = true;
>> + params->has_multifd_qatzip_sw_fallback = true;
>> params->has_multifd_zstd_level = true;
>> params->has_xbzrle_cache_size = true;
>> params->has_max_postcopy_bandwidth = true;
>> @@ -1147,6 +1183,14 @@ bool migrate_params_check(MigrationParameters
>> *params, Error **errp)
>> return false;
>> }
>>
>> + if (params->has_multifd_qatzip_level &&
>> + ((params->multifd_qatzip_level > 9) ||
>> + (params->multifd_qatzip_level < 1))) {
>> + error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
>> "multifd_qatzip_level",
>> + "a value between 1 and 9");
>> + return false;
>> + }
>> +
>> if (params->has_multifd_zstd_level &&
>> (params->multifd_zstd_level > 20)) {
>> error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
>> "multifd_zstd_level",
>> @@ -1312,6 +1356,12 @@ static void
>> migrate_params_test_apply(MigrateSetParameters *params,
>> if (params->has_multifd_compression) {
>> dest->multifd_compression = params->multifd_compression;
>> }
>> + if (params->has_multifd_qatzip_level) {
>> + dest->multifd_qatzip_level = params->multifd_qatzip_level;
>> + }
>> + if (params->has_multifd_qatzip_sw_fallback) {
>> + dest->multifd_qatzip_sw_fallback = params-
>>> multifd_qatzip_sw_fallback;
>> + }
>> if (params->has_xbzrle_cache_size) {
>> dest->xbzrle_cache_size = params->xbzrle_cache_size;
>> }
>> @@ -1447,6 +1497,13 @@ static void
>> migrate_params_apply(MigrateSetParameters *params, Error **errp)
>> if (params->has_multifd_compression) {
>> s->parameters.multifd_compression = params->multifd_compression;
>> }
>> + if (params->has_multifd_qatzip_level) {
>> + s->parameters.multifd_qatzip_level = params-
>>> multifd_qatzip_level;
>> + }
>> + if (params->has_multifd_qatzip_sw_fallback) {
>> + s->parameters.multifd_qatzip_sw_fallback =
>> + params->multifd_qatzip_sw_fallback;
>> + }
>> if (params->has_xbzrle_cache_size) {
>> s->parameters.xbzrle_cache_size = params->xbzrle_cache_size;
>> xbzrle_cache_resize(params->xbzrle_cache_size, errp);
>> diff --git a/migration/options.h b/migration/options.h
>> index 246c160aee..94aee24d97 100644
>> --- a/migration/options.h
>> +++ b/migration/options.h
>> @@ -87,6 +87,8 @@ MigMode migrate_mode(void);
>> int migrate_multifd_channels(void);
>> MultiFDCompression migrate_multifd_compression(void);
>> int migrate_multifd_zlib_level(void);
>> +int migrate_multifd_qatzip_level(void);
>> +bool migrate_multifd_qatzip_sw_fallback(void);
>> int migrate_multifd_zstd_level(void);
>> uint8_t migrate_throttle_trigger_threshold(void);
>> const char *migrate_tls_authz(void);
>> diff --git a/qapi/migration.json b/qapi/migration.json
>> index 0b33a71ab4..66ea6d32fc 100644
>> --- a/qapi/migration.json
>> +++ b/qapi/migration.json
>> @@ -853,6 +853,16 @@
>> # speed, and 9 means best compression ratio which will consume
>> # more CPU. Defaults to 1. (Since 5.0)
>> #
>> +# @multifd-qatzip-level: Set the compression level to be used in live
>> +# migration. The level is an integer between 1 and 9, where 1 means
>> +# the best compression speed, and 9 means the best compression
>> +# ratio which will consume more CPU. Defaults to 1.
>> +#
>> +# @multifd-qatzip-sw-fallback: Enable software fallback if QAT hardware
>> +# is unavailable. Defaults to false. Software fallback performance
>> +# is very poor compared to regular zlib, so be cautious about
>> +# enabling this option.
>> +#
>> # @multifd-zstd-level: Set the compression level to be used in live
>> # migration, the compression level is an integer between 0 and 20,
>> # where 0 means no compression, 1 means the best compression
>> @@ -915,6 +925,7 @@
>> 'xbzrle-cache-size', 'max-postcopy-bandwidth',
>> 'max-cpu-throttle', 'multifd-compression',
>> 'multifd-zlib-level', 'multifd-zstd-level',
>> + 'multifd-qatzip-level', 'multifd-qatzip-sw-fallback',
>> 'block-bitmap-mapping',
>> { 'name': 'x-vcpu-dirty-limit-period', 'features':
>> ['unstable'] },
>> 'vcpu-dirty-limit',
>> @@ -1045,6 +1056,16 @@
>> # speed, and 9 means best compression ratio which will consume
>> # more CPU. Defaults to 1. (Since 5.0)
>> #
>> +# @multifd-qatzip-level: Set the compression level to be used in live
>> +# migration. The level is an integer between 1 and 9, where 1 means
>> +# the best compression speed, and 9 means the best compression
>> +# ratio which will consume more CPU. Defaults to 1.
>> +#
>> +# @multifd-qatzip-sw-fallback: Enable software fallback if QAT hardware
>> +# is unavailable. Defaults to false. Software fallback performance
>> +# is very poor compared to regular zlib, so be cautious about
>> +# enabling this option.
>> +#
>> # @multifd-zstd-level: Set the compression level to be used in live
>> # migration, the compression level is an integer between 0 and 20,
>> # where 0 means no compression, 1 means the best compression
>> @@ -1125,6 +1146,8 @@
>> '*max-cpu-throttle': 'uint8',
>> '*multifd-compression': 'MultiFDCompression',
>> '*multifd-zlib-level': 'uint8',
>> + '*multifd-qatzip-level': 'uint8',
>> + '*multifd-qatzip-sw-fallback': 'bool',
>> '*multifd-zstd-level': 'uint8',
>> '*block-bitmap-mapping': [ 'BitmapMigrationNodeAlias' ],
>> '*x-vcpu-dirty-limit-period': { 'type': 'uint64',
>> @@ -1273,6 +1296,16 @@
>> # speed, and 9 means best compression ratio which will consume
>> # more CPU. Defaults to 1. (Since 5.0)
>> #
>> +# @multifd-qatzip-level: Set the compression level to be used in live
>> +# migration. The level is an integer between 1 and 9, where 1 means
>> +# the best compression speed, and 9 means the best compression
>> +# ratio which will consume more CPU. Defaults to 1.
>> +#
>> +# @multifd-qatzip-sw-fallback: Enable software fallback if QAT hardware
>> +# is unavailable. Defaults to false. Software fallback performance
>> +# is very poor compared to regular zlib, so be cautious about
>> +# enabling this option.
>> +#
>> # @multifd-zstd-level: Set the compression level to be used in live
>> # migration, the compression level is an integer between 0 and 20,
>> # where 0 means no compression, 1 means the best compression
>> @@ -1350,6 +1383,8 @@
>> '*max-cpu-throttle': 'uint8',
>> '*multifd-compression': 'MultiFDCompression',
>> '*multifd-zlib-level': 'uint8',
>> + '*multifd-qatzip-level': 'uint8',
>> + '*multifd-qatzip-sw-fallback': 'bool',
>> '*multifd-zstd-level': 'uint8',
>> '*block-bitmap-mapping': [ 'BitmapMigrationNodeAlias' ],
>> '*x-vcpu-dirty-limit-period': { 'type': 'uint64',
>> --
>> 2.30.2