From nobody Wed Nov 19 13:58:02 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1616085163; cv=none; d=zohomail.com; s=zohoarc; b=dUyV8sb5yVKdbu9tQBdZKeCydc0kCNWIySAr64bNUGAKsFM/z2ODYuAW3qVSRtvgmfVQ7QNgWL2BzyrBVzvygE4K3mXGdJNWDMoz+dy6LNyCLEqjgjAbklHBkosm+SNvdfRet05Di4xt/UOFVy1luk8L81lMRVPZEJsge5Rvl4o= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1616085163; h=Cc:Date:From:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:Sender:Subject:To; bh=msMNVQQY6U5AiOPj/mifYr9GD6Kk45Xc5DHcFcOtsm4=; b=ax6yx5xp43b61l63NRvIkl2uxTgHWUtFfWtjnqRpqQ7vN40h+sG+cgSINThAbARV6rHZcF6K2wFlmv+F/VkU4hxoPgrS4DwH9T+ByKr4aIWnQkJh8fvfgUAQJozzzIahsn26a+k5QC2QfdsPQQNsp/oz1ZYa95hbcAI171Og3zo= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1616085162738233.48700175319266; Thu, 18 Mar 2021 09:32:42 -0700 (PDT) Received: from localhost ([::1]:49984 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lMvZh-0004bz-E2 for importer@patchew.org; Thu, 18 Mar 2021 12:32:41 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:56102) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lMvIR-0003Iv-Ge for qemu-devel@nongnu.org; Thu, 18 Mar 2021 12:14:51 -0400 Received: from prt-mail.chinatelecom.cn ([42.123.76.220]:33947 helo=chinatelecom.cn) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lMvIM-00083G-F7 for qemu-devel@nongnu.org; Thu, 18 Mar 2021 12:14:51 -0400 Received: from clientip-171.223.98.62?logid-98a8b1c14c194512bf09e5bccc0e7986 (unknown [172.18.0.218]) by chinatelecom.cn (HERMES) with SMTP id 40D2D280072; Fri, 19 Mar 2021 00:14:32 +0800 (CST) Received: from ([172.18.0.218]) by App0025 with ESMTP id 98a8b1c14c194512bf09e5bccc0e7986 for qemu-devel@nongnu.org; Fri Mar 19 00:14:36 2021 HMM_SOURCE_IP: 172.18.0.218:3050.1946000287 HMM_ATTACHE_NUM: 0000 HMM_SOURCE_TYPE: SMTP X-189-SAVE-TO-SEND: +huangy81@chinatelecom.cn X-Transaction-ID: 98a8b1c14c194512bf09e5bccc0e7986 X-filter-score: filter<0> X-Real-From: huangy81@chinatelecom.cn X-Receive-IP: 172.18.0.218 X-MEDUSA-Status: 0 From: huangy81@chinatelecom.cn To: qemu-devel Subject: [PATCH] tests/migration: introduce multifd into guestperf Date: Fri, 19 Mar 2021 00:14:02 +0800 Message-Id: X-Mailer: git-send-email 1.8.3.1 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=42.123.76.220; envelope-from=huangy81@chinatelecom.cn; helo=chinatelecom.cn X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Hyman , Eduardo Habkost , Cleber Rosa Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Hyman Current guestperf tool does not support multifd migration, introducing multifd is good idea so that we can compare the performence of all type of migration. To request that multifd is enabled, with 4 channels: $ ./tests/migration/guestperf.py \ --multifd --multifd-channels 4 --output output.json To run the entire standardized set of multifd-enabled comparisons, with unix migration: $ ./tests/migration/guestperf-batch.py \ --dst-host localhost --transport unix \ --filter compr-multifd* --output outputdir Signed-off-by: Hyman --- tests/migration/guestperf/comparison.py | 14 ++++++++++++++ tests/migration/guestperf/engine.py | 16 ++++++++++++++++ tests/migration/guestperf/scenario.py | 12 ++++++++++-- tests/migration/guestperf/shell.py | 10 +++++++++- 4 files changed, 49 insertions(+), 3 deletions(-) diff --git a/tests/migration/guestperf/comparison.py b/tests/migration/gues= tperf/comparison.py index ba2edbe..971e7a3 100644 --- a/tests/migration/guestperf/comparison.py +++ b/tests/migration/guestperf/comparison.py @@ -121,4 +121,18 @@ def __init__(self, name, scenarios): Scenario("compr-xbzrle-cache-50", compression_xbzrle=3DTrue, compression_xbzrle_cache=3D50), ]), + + + # Looking at effect of multifd with + # varying numbers of channels + Comparison("compr-multifd", scenarios =3D [ + Scenario("compr-multifd-channels-4", + multifd=3DTrue, multifd_channels=3D4), + Scenario("compr-multifd-channels-8", + multifd=3DTrue, multifd_channels=3D8), + Scenario("compr-multifd-channels-32", + multifd=3DTrue, multifd_channels=3D32), + Scenario("compr-multifd-channels-64", + multifd=3DTrue, multifd_channels=3D64), + ]), ] diff --git a/tests/migration/guestperf/engine.py b/tests/migration/guestper= f/engine.py index 5189cf9..faf357b 100644 --- a/tests/migration/guestperf/engine.py +++ b/tests/migration/guestperf/engine.py @@ -186,6 +186,22 @@ def _migrate(self, hardware, scenario, src, dst, conne= ct_uri): value=3D(hardware._mem * 1024 * 1024 * 1024= / 100 * scenario._compression_xbzrle_cache)) =20 + if scenario._multifd: + resp =3D src.command("migrate-set-capabilities", + capabilities =3D [ + { "capability": "multifd", + "state": True } + ]) + resp =3D src.command("migrate-set-parameters", + multifd_channels=3Dscenario._multifd_channe= ls) + resp =3D dst.command("migrate-set-capabilities", + capabilities =3D [ + { "capability": "multifd", + "state": True } + ]) + resp =3D dst.command("migrate-set-parameters", + multifd_channels=3Dscenario._multifd_channe= ls) + resp =3D src.command("migrate", uri=3Dconnect_uri) =20 post_copy =3D False diff --git a/tests/migration/guestperf/scenario.py b/tests/migration/guestp= erf/scenario.py index 28ef36c..de70d9b 100644 --- a/tests/migration/guestperf/scenario.py +++ b/tests/migration/guestperf/scenario.py @@ -29,7 +29,8 @@ def __init__(self, name, post_copy=3DFalse, post_copy_iters=3D5, auto_converge=3DFalse, auto_converge_step=3D10, compression_mt=3DFalse, compression_mt_threads=3D1, - compression_xbzrle=3DFalse, compression_xbzrle_cache=3D10= ): + compression_xbzrle=3DFalse, compression_xbzrle_cache=3D10, + multifd=3DFalse, multifd_channels=3D2): =20 self._name =3D name =20 @@ -56,6 +57,9 @@ def __init__(self, name, self._compression_xbzrle =3D compression_xbzrle self._compression_xbzrle_cache =3D compression_xbzrle_cache # perc= entage of guest RAM =20 + self._multifd =3D multifd + self._multifd_channels =3D multifd_channels + def serialize(self): return { "name": self._name, @@ -73,6 +77,8 @@ def serialize(self): "compression_mt_threads": self._compression_mt_threads, "compression_xbzrle": self._compression_xbzrle, "compression_xbzrle_cache": self._compression_xbzrle_cache, + "multifd": self._multifd, + "multifd_channels": self._multifd_channels, } =20 @classmethod @@ -92,4 +98,6 @@ def deserialize(cls, data): data["compression_mt"], data["compression_mt_threads"], data["compression_xbzrle"], - data["compression_xbzrle_cache"]) + data["compression_xbzrle_cache"], + data["multifd"], + data["multifd_channels"]) diff --git a/tests/migration/guestperf/shell.py b/tests/migration/guestperf= /shell.py index f838888..8a809e3 100644 --- a/tests/migration/guestperf/shell.py +++ b/tests/migration/guestperf/shell.py @@ -122,6 +122,11 @@ def __init__(self): parser.add_argument("--compression-xbzrle", dest=3D"compression_xb= zrle", default=3DFalse, action=3D"store_true") parser.add_argument("--compression-xbzrle-cache", dest=3D"compress= ion_xbzrle_cache", default=3D10, type=3Dint) =20 + parser.add_argument("--multifd", dest=3D"multifd", default=3DFalse, + action=3D"store_true") + parser.add_argument("--multifd-channels", dest=3D"multifd_channels= ", + default=3D2, type=3Dint) + def get_scenario(self, args): return Scenario(name=3D"perfreport", downtime=3Dargs.downtime, @@ -142,7 +147,10 @@ def get_scenario(self, args): compression_mt_threads=3Dargs.compression_mt_threa= ds, =20 compression_xbzrle=3Dargs.compression_xbzrle, - compression_xbzrle_cache=3Dargs.compression_xbzrle= _cache) + compression_xbzrle_cache=3Dargs.compression_xbzrle= _cache, + + multifd=3Dargs.multifd, + multifd_channels=3Dargs.multifd_channels) =20 def run(self, argv): args =3D self._parser.parse_args(argv) --=20 1.8.3.1