> -----Original Message-----
> From: Yichen Wang <yichen.w...@bytedance.com>
> Sent: Thursday, June 27, 2024 8:17 AM
> To: Liu, Yuan1 <yuan1....@intel.com>
> Cc: Bryan Zhang <bryan.zh...@bytedance.com>; qemu-devel@nongnu.org;
> pet...@redhat.com; faro...@suse.de; berra...@redhat.com; Zou, Nanhai
> <nanhai....@intel.com>; hao.xi...@linux.dev
> Subject: Re: [PATCH v2 2/5] migration: Add migration parameters for QATzip
> 
> 
> 
> > 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.

Please use level 1 as the default compression level, my reason below
1. The level 6 does not significantly improve the compression ratio than level 
1 for Silesia dataset
   But the throughput dropped by 10%. I also test Calgary Corpus dataset, same 
with Silesia.
2. Users can modify the actual compression level according to 
multifd_qatzip_level.

> >> @@ -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
> 

Reply via email to