guestperf: Introduce multifd compression option

Guestperf tool does not cover the multifd compression option
currently, it is worth supporting so that developers can
analysis the migration performance with different
compression algorithms.

Multifd support 4 compression algorithms currently:
zlib, zstd, qpl, uadk

To request that multifd with the specified compression
algorithm such as zlib:
$ ./tests/migration-stress/guestperf.py \
    --multifd --multifd-channels 4 --multifd-compression zlib \
    --output output.json

To run the entire standardized set of multifd compression
comparisons, with unix migration:
$ ./tests/migration-stress/guestperf-batch.py \
    --dst-host localhost --transport unix \
    --filter compr-multifd-compression* --output outputdir

Signed-off-by: Hyman Huang <yong.huang@smartx.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Message-ID: <c0e3313d81e8130f8119ef4f242e4625886278cf.1739530098.git.yong.huang@smartx.com>
Signed-off-by: Fabiano Rosas <farosas@suse.de>
This commit is contained in:
Hyman Huang 2025-02-14 18:55:25 +08:00 committed by Fabiano Rosas
parent 42f5975cd8
commit 45f34156e4
4 changed files with 35 additions and 2 deletions

View File

@ -158,4 +158,17 @@ COMPARISONS = [
Scenario("compr-dirty-limit-50MB",
dirty_limit=True, vcpu_dirty_limit=50),
]),
# Looking at effect of multifd with
# different compression algorithms
Comparison("compr-multifd-compression", scenarios = [
Scenario("compr-multifd-compression-zlib",
multifd=True, multifd_channels=2, multifd_compression="zlib"),
Scenario("compr-multifd-compression-zstd",
multifd=True, multifd_channels=2, multifd_compression="zstd"),
Scenario("compr-multifd-compression-qpl",
multifd=True, multifd_channels=2, multifd_compression="qpl"),
Scenario("compr-multifd-compression-uadk",
multifd=True, multifd_channels=2, multifd_compression="uadk"),
]),
]

View File

@ -31,6 +31,8 @@ sys.path.append(os.path.join(os.path.dirname(__file__),
'..', '..', '..', 'python'))
from qemu.machine import QEMUMachine
# multifd supported compression algorithms
MULTIFD_CMP_ALGS = ("zlib", "zstd", "qpl", "uadk")
class Engine(object):
@ -191,6 +193,12 @@ class Engine(object):
scenario._compression_xbzrle_cache))
if scenario._multifd:
if (scenario._multifd_compression and
(scenario._multifd_compression not in MULTIFD_CMP_ALGS)):
raise Exception("unsupported multifd compression "
"algorithm: %s" %
scenario._multifd_compression)
resp = src.cmd("migrate-set-capabilities",
capabilities = [
{ "capability": "multifd",
@ -206,6 +214,12 @@ class Engine(object):
resp = dst.cmd("migrate-set-parameters",
multifd_channels=scenario._multifd_channels)
if scenario._multifd_compression:
resp = src.cmd("migrate-set-parameters",
multifd_compression=scenario._multifd_compression)
resp = dst.cmd("migrate-set-parameters",
multifd_compression=scenario._multifd_compression)
if scenario._dirty_limit:
if not hardware._dirty_ring_size:
raise Exception("dirty ring size must be configured when "

View File

@ -30,7 +30,7 @@ class Scenario(object):
auto_converge=False, auto_converge_step=10,
compression_mt=False, compression_mt_threads=1,
compression_xbzrle=False, compression_xbzrle_cache=10,
multifd=False, multifd_channels=2,
multifd=False, multifd_channels=2, multifd_compression="",
dirty_limit=False, x_vcpu_dirty_limit_period=500,
vcpu_dirty_limit=1):
@ -61,6 +61,7 @@ class Scenario(object):
self._multifd = multifd
self._multifd_channels = multifd_channels
self._multifd_compression = multifd_compression
self._dirty_limit = dirty_limit
self._x_vcpu_dirty_limit_period = x_vcpu_dirty_limit_period
@ -85,6 +86,7 @@ class Scenario(object):
"compression_xbzrle_cache": self._compression_xbzrle_cache,
"multifd": self._multifd,
"multifd_channels": self._multifd_channels,
"multifd_compression": self._multifd_compression,
"dirty_limit": self._dirty_limit,
"x_vcpu_dirty_limit_period": self._x_vcpu_dirty_limit_period,
"vcpu_dirty_limit": self._vcpu_dirty_limit,
@ -109,4 +111,5 @@ class Scenario(object):
data["compression_xbzrle"],
data["compression_xbzrle_cache"],
data["multifd"],
data["multifd_channels"])
data["multifd_channels"],
data["multifd_compression"])

View File

@ -131,6 +131,8 @@ class Shell(BaseShell):
action="store_true")
parser.add_argument("--multifd-channels", dest="multifd_channels",
default=2, type=int)
parser.add_argument("--multifd-compression", dest="multifd_compression",
default="")
parser.add_argument("--dirty-limit", dest="dirty_limit", default=False,
action="store_true")
@ -167,6 +169,7 @@ class Shell(BaseShell):
multifd=args.multifd,
multifd_channels=args.multifd_channels,
multifd_compression=args.multifd_compression,
dirty_limit=args.dirty_limit,
x_vcpu_dirty_limit_period=\