From nobody Tue Oct 28 17:55:02 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1760023987; cv=none; d=zohomail.com; s=zohoarc; b=cNmK1OAq1G2pmjtI8LBz6eibHLBK9c2ZJ3tBjsi0r6uhUC/Y5mnzKV5lOoAA/dllxkAsewoNuqDnPA/S2cbu29q6tkfrme7vfWax8YRhE2qEmPkxTCDXDncM0Abo2k+9JpIjLJF5Y9JrKFeii4QWIpP2T9pRE81vNIcs0GxqWxs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1760023987; h=Content-Type:Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=trwvL4nGEtmBna9VwBd4z3WqbdBNWP79OBAFXgvvvYE=; b=U0DlgtSV8KqMI0c4IAJHeB9tzaDKZUc4jrNk5Zv1tnNvzZrpg9R1UEaO+u9ogNIAKvFIPoyNPSPDAjBzzLOaABp/Mnqr9BHBtKhZMb6Lzxlpl/Ik3fA3I6KDyRvKGMDGJR21l4UzRPk8fCNteEL78wO0r3zCbzeZIVMidqHxgks= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1760023987698680.8151970412173; Thu, 9 Oct 2025 08:33:07 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 069C8443A0; Thu, 9 Oct 2025 11:33:06 -0400 (EDT) Received: from [172.19.199.20] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 579E244890; Thu, 9 Oct 2025 11:17:30 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 5261B444CD; Thu, 9 Oct 2025 11:17:07 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id E1A01440A3 for ; Thu, 9 Oct 2025 11:16:35 -0400 (EDT) Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-507-FU3xyp8CPbiSlWw0sCPwIA-1; Thu, 09 Oct 2025 11:16:34 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 4C6531800290 for ; Thu, 9 Oct 2025 15:16:33 +0000 (UTC) Received: from speedmetal.lan (unknown [10.44.22.12]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 84CA51955F22 for ; Thu, 9 Oct 2025 15:16:32 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-3.1 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_PASS autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1760022995; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=trwvL4nGEtmBna9VwBd4z3WqbdBNWP79OBAFXgvvvYE=; b=bYT9K0eICv+XIxpgS0fWT38S/8r5a1IGvE7KBCf1uuBph3Wb6tVaUbDu8GOFwhvDCt46R+ fYWtgU19HwMYESNTwjyYjHgne3JmaIbBO48JLFC7FYiGAq/tJ8sHV9pn8O0SC5n85EBhJ8 sQFgLXJIv/51YEHjyj2etL1F3Z4HMiQ= X-MC-Unique: FU3xyp8CPbiSlWw0sCPwIA-1 X-Mimecast-MFC-AGG-ID: FU3xyp8CPbiSlWw0sCPwIA_1760022993 To: devel@lists.libvirt.org Subject: [RFC PATCH 11/16] qemu_monitor: Extract 'timed_stats' of block devices Date: Thu, 9 Oct 2025 17:16:11 +0200 Message-ID: <55d92ab5b501720fdf8e0421bf6a2b916c13c881.1760022633.git.pkrempa@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: j3zctlt3XefQHDUzsIJjDLYmEw1Hx6BWZwXXUCnKkNw_1760022993 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: H7ADRWNNJSKM23STV62S5BFIRCD4XXGA X-Message-ID-Hash: H7ADRWNNJSKM23STV62S5BFIRCD4XXGA X-MailFrom: pkrempa@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Peter Krempa via Devel Reply-To: Peter Krempa X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1760023989408154100 Content-Type: text/plain; charset="utf-8" From: Peter Krempa The 'timed_stats' block is a set of statistics gathered in configurable time intervals. The stats include latency timings of reads/writes as well as the depth of the request queues. Signed-off-by: Peter Krempa --- src/qemu/qemu_monitor.c | 1 + src/qemu/qemu_monitor.h | 29 ++++++++++++++++++++++++ src/qemu/qemu_monitor_json.c | 44 ++++++++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 554898b93f..fb01335f89 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -1984,6 +1984,7 @@ qemuBlockStatsFinalize(GObject *object) return; g_free(stats->limits); + g_free(stats->timed_stats); G_OBJECT_CLASS(qemu_block_stats_parent_class)->finalize(object); } diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 9b9292e48d..a93d722418 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -806,6 +806,31 @@ struct qemuBlockStatsLimits { }; +struct qemuBlockStatsTimed { + unsigned long long interval_length; + + /* latencies are in nanoseconds */ + unsigned long long rd_latency_min; + unsigned long long rd_latency_max; + unsigned long long rd_latency_avg; + + unsigned long long wr_latency_min; + unsigned long long wr_latency_max; + unsigned long long wr_latency_avg; + + unsigned long long zone_append_latency_min; + unsigned long long zone_append_latency_max; + unsigned long long zone_append_latency_avg; + + unsigned long long flush_latency_min; + unsigned long long flush_latency_max; + unsigned long long flush_latency_avg; + + double rd_queue_depth_avg; + double wr_queue_depth_avg; + double zone_append_queue_depth_avg; +}; + struct _qemuBlockStats { GObject parent; @@ -829,6 +854,10 @@ struct _qemuBlockStats { unsigned long long write_threshold; struct qemuBlockStatsLimits *limits; + + /* block accounting/timed stats from qemu - one entry per interval con= figured */ + size_t n_timed_stats; + struct qemuBlockStatsTimed *timed_stats; }; G_DECLARE_FINAL_TYPE(qemuBlockStats, qemu_block_stats, QEMU, BLOCK_STATS, = GObject); diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index cf63f43318..0cb20d4387 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -2386,6 +2386,45 @@ qemuMonitorJSONGetBlockInfo(qemuMonitor *mon, } +static void +qemuMonitorJSONBlockStatsCollectDataTimedOne(virJSONValue *j, + struct qemuBlockStatsTimed *s) +{ + virJSONValueObjectGetNumberUlong(j, "interval_length", &s->interval_le= ngth); + + virJSONValueObjectGetNumberUlong(j, "min_rd_latency_ns", &s->rd_latenc= y_min); + virJSONValueObjectGetNumberUlong(j, "max_rd_latency_ns", &s->rd_latenc= y_max); + virJSONValueObjectGetNumberUlong(j, "avg_rd_latency_ns", &s->rd_latenc= y_avg); + + virJSONValueObjectGetNumberUlong(j, "min_wr_latency_ns", &s->wr_latenc= y_min); + virJSONValueObjectGetNumberUlong(j, "max_wr_latency_ns", &s->wr_latenc= y_max); + virJSONValueObjectGetNumberUlong(j, "avg_wr_latency_ns", &s->wr_latenc= y_avg); + + virJSONValueObjectGetNumberUlong(j, "min_zone_append_latency_ns", &s->= zone_append_latency_min); + virJSONValueObjectGetNumberUlong(j, "max_zone_append_latency_ns", &s->= zone_append_latency_max); + virJSONValueObjectGetNumberUlong(j, "avg_zone_append_latency_ns", &s->= zone_append_latency_avg); + + virJSONValueObjectGetNumberDouble(j, "avg_rd_queue_depth", &s->rd_queu= e_depth_avg); + virJSONValueObjectGetNumberDouble(j, "avg_wr_queue_depth", &s->wr_queu= e_depth_avg); + virJSONValueObjectGetNumberDouble(j, "avg_zone_append_queue_depth", &s= ->zone_append_queue_depth_avg); +} + + +static void +qemuMonitorJSONBlockStatsCollectDataTimed(virJSONValue *timed_stats, + qemuBlockStats *bstats) +{ + size_t i; + + bstats->n_timed_stats =3D virJSONValueArraySize(timed_stats); + bstats->timed_stats =3D g_new0(struct qemuBlockStatsTimed, bstats->n_t= imed_stats); + + for (i =3D 0; i < bstats->n_timed_stats; i++) + qemuMonitorJSONBlockStatsCollectDataTimedOne(virJSONValueArrayGet(= timed_stats, i), + bstats->timed_stats += i); +} + + static qemuBlockStats * qemuMonitorJSONBlockStatsCollectData(virJSONValue *dev, int *nstats) @@ -2394,6 +2433,7 @@ qemuMonitorJSONBlockStatsCollectData(virJSONValue *de= v, virJSONValue *parent; virJSONValue *parentstats; virJSONValue *stats; + virJSONValue *timed_stats; if ((stats =3D virJSONValueObjectGetObject(dev, "stats")) =3D=3D NULL)= { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", @@ -2429,6 +2469,10 @@ qemuMonitorJSONBlockStatsCollectData(virJSONValue *d= ev, bstats->wr_highest_offset_valid =3D true; } + if ((timed_stats =3D virJSONValueObjectGetArray(stats, "timed_stats"))= && + virJSONValueArraySize(timed_stats) > 0) + qemuMonitorJSONBlockStatsCollectDataTimed(timed_stats, bstats); + return g_steal_pointer(&bstats); } --=20 2.51.0