From nobody Sat Apr 27 19:03:34 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.37 as permitted sender) client-ip=209.132.183.37; envelope-from=libvir-list-bounces@redhat.com; helo=mx5-phx2.redhat.com; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.37 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; Return-Path: Received: from mx5-phx2.redhat.com (mx5-phx2.redhat.com [209.132.183.37]) by mx.zohomail.com with SMTPS id 1486034002314746.4259388952587; Thu, 2 Feb 2017 03:13:22 -0800 (PST) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by mx5-phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v12B9jae047153; Thu, 2 Feb 2017 06:09:45 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v12B9hno032594 for ; Thu, 2 Feb 2017 06:09:43 -0500 Received: from mx1.redhat.com (ext-mx08.extmail.prod.ext.phx2.redhat.com [10.5.110.32]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v12B9hUr014825 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 2 Feb 2017 06:09:43 -0500 Received: from relay.sw.ru (mailhub.sw.ru [195.214.232.25]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C87B7C054900 for ; Thu, 2 Feb 2017 11:09:41 +0000 (UTC) Received: from dim-vz7.qa.sw.ru (msk-vpn.virtuozzo.com [195.214.232.6]) by relay.sw.ru (8.13.4/8.13.4) with ESMTP id v12B9dDX021115 for ; Thu, 2 Feb 2017 14:09:39 +0300 (MSK) From: Nikolay Shirokovskiy To: libvir-list@redhat.com Date: Thu, 2 Feb 2017 14:09:31 +0300 Message-Id: <1486033773-575308-2-git-send-email-nshirokovskiy@virtuozzo.com> In-Reply-To: <1486033773-575308-1-git-send-email-nshirokovskiy@virtuozzo.com> References: <1486033773-575308-1-git-send-email-nshirokovskiy@virtuozzo.com> X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Thu, 02 Feb 2017 11:09:42 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Thu, 02 Feb 2017 11:09:42 +0000 (UTC) for IP:'195.214.232.25' DOMAIN:'mailhub.sw.ru' HELO:'relay.sw.ru' FROM:'nshirokovskiy@virtuozzo.com' RCPT:'' X-RedHat-Spam-Score: 0.699 (BAYES_50, DCC_REPUT_13_19, SPF_PASS) 195.214.232.25 mailhub.sw.ru 195.214.232.25 mailhub.sw.ru X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Scanned-By: MIMEDefang 2.78 on 10.5.110.32 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 1/3] cgroup: extract interface part from virCgroupGetPercpuStats X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" virCgroupGetPercpuStats do 2 things. First it extracts per cpu stats from cgroups, second it puts stats values into virTypedParameterPtr in accordance with virDomainGetCPUStats interface. As we need first function in order to prodive per cpus stats in virConnectGetAllDomainStats lets split these two functions. --- src/libvirt_private.syms | 2 + src/util/vircgroup.c | 140 +++++++++++++++++++++++++++++++++++--------= ---- src/util/vircgroup.h | 17 ++++++ 3 files changed, 124 insertions(+), 35 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 8e994c7..e05335e 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1312,6 +1312,7 @@ virCgroupBindMount; virCgroupControllerAvailable; virCgroupControllerTypeFromString; virCgroupControllerTypeToString; +virCgroupCpuStatsFree; virCgroupDelThread; virCgroupDenyAllDevices; virCgroupDenyDevice; @@ -1335,6 +1336,7 @@ virCgroupGetCpusetCpus; virCgroupGetCpusetMemoryMigrate; virCgroupGetCpusetMems; virCgroupGetCpuShares; +virCgroupGetCpuStats; virCgroupGetDevicePermsString; virCgroupGetDomainTotalCpuStats; virCgroupGetFreezerState; diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c index 5aa1db5..e4eaf32 100644 --- a/src/util/vircgroup.c +++ b/src/util/vircgroup.c @@ -3170,6 +3170,105 @@ virCgroupGetPercpuVcpuSum(virCgroupPtr group, } =20 =20 +void virCgroupCpuStatsFree(virCgroupCpuStatsPtr stats) +{ + VIR_FREE(stats->time); + VIR_FREE(stats->vtime); +} + + +/* + * Parses sparse per cpu usage cgroup output into continuos array. + * Sparse map is given by @cpumap. + */ +static int +virCgroupGetPercpuTime(virCgroupPtr group, + virBitmapPtr cpumap, + unsigned long long *time) +{ + char *pos; + char *buf =3D NULL; + size_t i; + int ret =3D -1; + int ncpus =3D virBitmapSize(cpumap); + + memset(time, 0, sizeof(*time) * ncpus); + + /* we get percpu cputime accounting info. */ + if (virCgroupGetCpuacctPercpuUsage(group, &buf)) + goto cleanup; + pos =3D buf; + + for (i =3D 0; i < ncpus; i++) { + if (!virBitmapIsBitSet(cpumap, i)) + continue; + + if (virStrToLong_ull(pos, &pos, 10, &time[i]) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("cpuacct parse error")); + goto cleanup; + } + } + + ret =3D 0; + + cleanup: + VIR_FREE(buf); + return ret; +} + + +/* + * Get per cpu stats for given domain group. + * If @guestvcpus is not NULL per cpu stats for virtual cpu threads + * are provided as well. + */ +int +virCgroupGetCpuStats(virCgroupPtr group, + virBitmapPtr guestvcpus, + virCgroupCpuStatsPtr stats) +{ + int ret =3D -1; + int ncpus; + virBitmapPtr cpumap =3D NULL; + + /* To parse account file, we need to know how many cpus are present. = */ + if (!(cpumap =3D virHostCPUGetPresentBitmap())) + return -1; + + ncpus =3D virBitmapSize(cpumap); + if (ncpus =3D=3D 0) { + ret =3D 0; + goto cleanup; + } + + memset(stats, 0, sizeof(*stats)); + + if (VIR_ALLOC_N(stats->time, ncpus) < 0) + goto cleanup; + + if (virCgroupGetPercpuTime(group, cpumap, stats->time) < 0) + goto cleanup; + + if (guestvcpus) { + if (VIR_ALLOC_N(stats->vtime, ncpus) < 0) + goto cleanup; + + if (virCgroupGetPercpuVcpuSum(group, guestvcpus, stats->vtime, + ncpus, cpumap) < 0) + goto cleanup; + } + + ret =3D ncpus; + + cleanup: + if (ret < 0) + virCgroupCpuStatsFree(stats); + virBitmapFree(cpumap); + return ret; +} + + /** * virCgroupGetPercpuStats: * @cgroup: cgroup data structure @@ -3201,13 +3300,9 @@ virCgroupGetPercpuStats(virCgroupPtr group, int ret =3D -1; size_t i; int need_cpus, total_cpus; - char *pos; - char *buf =3D NULL; - unsigned long long *sum_cpu_time =3D NULL; virTypedParameterPtr ent; int param_idx; - unsigned long long cpu_time; - virBitmapPtr cpumap =3D NULL; + virCgroupCpuStats stats =3D {0}; =20 /* return the number of supported params */ if (nparams =3D=3D 0 && ncpus !=3D 0) { @@ -3217,12 +3312,9 @@ virCgroupGetPercpuStats(virCgroupPtr group, return CGROUP_NB_PER_CPU_STAT_PARAM + 1; } =20 - /* To parse account file, we need to know how many cpus are present. = */ - if (!(cpumap =3D virHostCPUGetPresentBitmap())) + if ((total_cpus =3D virCgroupGetCpuStats(group, guestvcpus, &stats)) <= 0) return -1; =20 - total_cpus =3D virBitmapSize(cpumap); - /* return total number of cpus */ if (ncpus =3D=3D 0) { ret =3D total_cpus; @@ -3236,30 +3328,16 @@ virCgroupGetPercpuStats(virCgroupPtr group, goto cleanup; } =20 - /* we get percpu cputime accounting info. */ - if (virCgroupGetCpuacctPercpuUsage(group, &buf)) - goto cleanup; - pos =3D buf; - /* return percpu cputime in index 0 */ param_idx =3D 0; =20 /* number of cpus to compute */ need_cpus =3D MIN(total_cpus, start_cpu + ncpus); =20 - for (i =3D 0; i < need_cpus; i++) { - if (!virBitmapIsBitSet(cpumap, i)) { - cpu_time =3D 0; - } else if (virStrToLong_ull(pos, &pos, 10, &cpu_time) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("cpuacct parse error")); - goto cleanup; - } - if (i < start_cpu) - continue; + for (i =3D start_cpu; i < need_cpus; i++) { ent =3D ¶ms[(i - start_cpu) * nparams + param_idx]; if (virTypedParameterAssign(ent, VIR_DOMAIN_CPU_STATS_CPUTIME, - VIR_TYPED_PARAM_ULLONG, cpu_time) < 0) + VIR_TYPED_PARAM_ULLONG, stats.time[i])= < 0) goto cleanup; } =20 @@ -3267,18 +3345,12 @@ virCgroupGetPercpuStats(virCgroupPtr group, param_idx =3D 1; =20 if (guestvcpus && param_idx < nparams) { - if (VIR_ALLOC_N(sum_cpu_time, need_cpus) < 0) - goto cleanup; - if (virCgroupGetPercpuVcpuSum(group, guestvcpus, sum_cpu_time, - need_cpus, cpumap) < 0) - goto cleanup; - for (i =3D start_cpu; i < need_cpus; i++) { if (virTypedParameterAssign(¶ms[(i - start_cpu) * nparams + param_idx], VIR_DOMAIN_CPU_STATS_VCPUTIME, VIR_TYPED_PARAM_ULLONG, - sum_cpu_time[i]) < 0) + stats.vtime[i]) < 0) goto cleanup; } =20 @@ -3288,9 +3360,7 @@ virCgroupGetPercpuStats(virCgroupPtr group, ret =3D param_idx; =20 cleanup: - virBitmapFree(cpumap); - VIR_FREE(sum_cpu_time); - VIR_FREE(buf); + virCgroupCpuStatsFree(&stats); return ret; } =20 diff --git a/src/util/vircgroup.h b/src/util/vircgroup.h index 2de1bf2..40b420d 100644 --- a/src/util/vircgroup.h +++ b/src/util/vircgroup.h @@ -297,4 +297,21 @@ int virCgroupSetOwner(virCgroupPtr cgroup, int virCgroupHasEmptyTasks(virCgroupPtr cgroup, int controller); =20 bool virCgroupControllerAvailable(int controller); + +struct virCgroupCpuStats_ { + /* time arrays are not sparsed, that is if cpu is offline + * it has value 0 for time instead of being skipped */ + unsigned long long *time; /* per cpu time */ + unsigned long long *vtime;/* per cpu time for virtual cpu threads */ +}; + +typedef struct virCgroupCpuStats_ virCgroupCpuStats; +typedef virCgroupCpuStats *virCgroupCpuStatsPtr; + +int virCgroupGetCpuStats(virCgroupPtr group, + virBitmapPtr guestvcpus, + virCgroupCpuStatsPtr stats); +void virCgroupCpuStatsFree(virCgroupCpuStatsPtr stats); + + #endif /* __VIR_CGROUP_H__ */ --=20 1.8.3.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sat Apr 27 19:03:34 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.24 as permitted sender) client-ip=209.132.183.24; envelope-from=libvir-list-bounces@redhat.com; helo=mx3-phx2.redhat.com; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.24 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; Return-Path: Received: from mx3-phx2.redhat.com (mx3-phx2.redhat.com [209.132.183.24]) by mx.zohomail.com with SMTPS id 148603402099189.5980931146579; Thu, 2 Feb 2017 03:13:40 -0800 (PST) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by mx3-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v12BAKhY015530; Thu, 2 Feb 2017 06:10:20 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v12B9k24032619 for ; Thu, 2 Feb 2017 06:09:46 -0500 Received: from mx1.redhat.com (ext-mx07.extmail.prod.ext.phx2.redhat.com [10.5.110.31]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v12B9kJL014840 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 2 Feb 2017 06:09:46 -0500 Received: from relay.sw.ru (mailhub.sw.ru [195.214.232.25]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C1771C04B928 for ; Thu, 2 Feb 2017 11:09:41 +0000 (UTC) Received: from dim-vz7.qa.sw.ru (msk-vpn.virtuozzo.com [195.214.232.6]) by relay.sw.ru (8.13.4/8.13.4) with ESMTP id v12B9dDY021115 for ; Thu, 2 Feb 2017 14:09:39 +0300 (MSK) From: Nikolay Shirokovskiy To: libvir-list@redhat.com Date: Thu, 2 Feb 2017 14:09:32 +0300 Message-Id: <1486033773-575308-3-git-send-email-nshirokovskiy@virtuozzo.com> In-Reply-To: <1486033773-575308-1-git-send-email-nshirokovskiy@virtuozzo.com> References: <1486033773-575308-1-git-send-email-nshirokovskiy@virtuozzo.com> X-Greylist: Delayed for 75:54:56 by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Thu, 02 Feb 2017 11:09:42 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Thu, 02 Feb 2017 11:09:42 +0000 (UTC) for IP:'195.214.232.25' DOMAIN:'mailhub.sw.ru' HELO:'relay.sw.ru' FROM:'nshirokovskiy@virtuozzo.com' RCPT:'' X-RedHat-Spam-Score: 0.699 (BAYES_50, DCC_REPUT_13_19, SPF_PASS) 195.214.232.25 mailhub.sw.ru 195.214.232.25 mailhub.sw.ru X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Scanned-By: MIMEDefang 2.78 on 10.5.110.31 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 2/3] cgroup: reuse virCgroupGetPercpuTime in virCgroupGetPercpuVcpuSum X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" --- src/util/vircgroup.c | 44 ++++++++++++++++++++------------------------ 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c index e4eaf32..06dd589 100644 --- a/src/util/vircgroup.c +++ b/src/util/vircgroup.c @@ -89,6 +89,10 @@ typedef enum { */ } virCgroupFlags; =20 +static int +virCgroupGetPercpuTime(virCgroupPtr group, + virBitmapPtr cpumap, + unsigned long long *time); =20 /** * virCgroupGetDevicePermsString: @@ -3123,49 +3127,41 @@ virCgroupDenyDevicePath(virCgroupPtr group, * s3 =3D t03 + t13 */ static int -virCgroupGetPercpuVcpuSum(virCgroupPtr group, - virBitmapPtr guestvcpus, - unsigned long long *sum_cpu_time, - size_t nsum, - virBitmapPtr cpumap) +virCgroupGetPercpuVTime(virCgroupPtr group, + virBitmapPtr guestvcpus, + unsigned long long *vtime, + virBitmapPtr cpumap) { int ret =3D -1; ssize_t i =3D -1; - char *buf =3D NULL; virCgroupPtr group_vcpu =3D NULL; + unsigned long long *time =3D NULL; + int ncpus =3D virBitmapSize(cpumap); + + + if (VIR_ALLOC_N(time, ncpus) < 0) + goto cleanup; =20 while ((i =3D virBitmapNextSetBit(guestvcpus, i)) >=3D 0) { - char *pos; - unsigned long long tmp; ssize_t j; =20 if (virCgroupNewThread(group, VIR_CGROUP_THREAD_VCPU, i, false, &group_vcpu) < 0) goto cleanup; =20 - if (virCgroupGetCpuacctPercpuUsage(group_vcpu, &buf) < 0) + if (virCgroupGetPercpuTime(group_vcpu, cpumap, time) < 0) goto cleanup; =20 - pos =3D buf; - for (j =3D virBitmapNextSetBit(cpumap, -1); - j >=3D 0 && j < nsum; - j =3D virBitmapNextSetBit(cpumap, j)) { - if (virStrToLong_ull(pos, &pos, 10, &tmp) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("cpuacct parse error")); - goto cleanup; - } - sum_cpu_time[j] +=3D tmp; - } + for (j =3D 0; j < ncpus; j++) + vtime[j] +=3D time[j]; =20 virCgroupFree(&group_vcpu); - VIR_FREE(buf); } =20 ret =3D 0; cleanup: virCgroupFree(&group_vcpu); - VIR_FREE(buf); + VIR_FREE(time); return ret; } =20 @@ -3254,8 +3250,8 @@ virCgroupGetCpuStats(virCgroupPtr group, if (VIR_ALLOC_N(stats->vtime, ncpus) < 0) goto cleanup; =20 - if (virCgroupGetPercpuVcpuSum(group, guestvcpus, stats->vtime, - ncpus, cpumap) < 0) + if (virCgroupGetPercpuVTime(group, guestvcpus, stats->vtime, + cpumap) < 0) goto cleanup; } =20 --=20 1.8.3.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sat Apr 27 19:03:34 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.37 as permitted sender) client-ip=209.132.183.37; envelope-from=libvir-list-bounces@redhat.com; helo=mx5-phx2.redhat.com; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.37 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; Return-Path: Received: from mx5-phx2.redhat.com (mx5-phx2.redhat.com [209.132.183.37]) by mx.zohomail.com with SMTPS id 1486034003915377.60814397854153; Thu, 2 Feb 2017 03:13:23 -0800 (PST) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by mx5-phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v12B9im7047151; Thu, 2 Feb 2017 06:09:45 -0500 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v12B9iJT032599 for ; Thu, 2 Feb 2017 06:09:44 -0500 Received: from mx1.redhat.com (ext-mx10.extmail.prod.ext.phx2.redhat.com [10.5.110.39]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v12B9hKf011970 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 2 Feb 2017 06:09:44 -0500 Received: from relay.sw.ru (mailhub.sw.ru [195.214.232.25]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C3423624B9 for ; Thu, 2 Feb 2017 11:09:41 +0000 (UTC) Received: from dim-vz7.qa.sw.ru (msk-vpn.virtuozzo.com [195.214.232.6]) by relay.sw.ru (8.13.4/8.13.4) with ESMTP id v12B9dDZ021115 for ; Thu, 2 Feb 2017 14:09:39 +0300 (MSK) From: Nikolay Shirokovskiy To: libvir-list@redhat.com Date: Thu, 2 Feb 2017 14:09:33 +0300 Message-Id: <1486033773-575308-4-git-send-email-nshirokovskiy@virtuozzo.com> In-Reply-To: <1486033773-575308-1-git-send-email-nshirokovskiy@virtuozzo.com> References: <1486033773-575308-1-git-send-email-nshirokovskiy@virtuozzo.com> X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 02 Feb 2017 11:09:42 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 02 Feb 2017 11:09:42 +0000 (UTC) for IP:'195.214.232.25' DOMAIN:'mailhub.sw.ru' HELO:'relay.sw.ru' FROM:'nshirokovskiy@virtuozzo.com' RCPT:'' X-RedHat-Spam-Score: 0.699 (BAYES_50, DCC_REPUT_13_19, SPF_PASS) 195.214.232.25 mailhub.sw.ru 195.214.232.25 mailhub.sw.ru X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Scanned-By: MIMEDefang 2.78 on 10.5.110.39 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 3/3] add per cpu stats to all domain stats X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Add per host cpu info provided in virDomainGetCPUStats to the stats provided in virConnectGetAllDomainStats. Namely: "cpu.count" - number of host cpus "cpu..time" - total cpu time spent for this domain in nanoseconds "cpu..vtime" - time spent in virtual cpu threads for this domain in nanoseconds --- docs/news.xml | 9 ++++++ include/libvirt/libvirt-domain.h | 1 + src/libvirt-domain.c | 7 +++++ src/qemu/qemu_driver.c | 64 ++++++++++++++++++++++++++++++++++++= ++++ tools/virsh-domain-monitor.c | 7 +++++ tools/virsh.pod | 11 +++++-- 6 files changed, 97 insertions(+), 2 deletions(-) diff --git a/docs/news.xml b/docs/news.xml index f408293..6e40c33 100644 --- a/docs/news.xml +++ b/docs/news.xml @@ -42,6 +42,15 @@ Allow setting MTU size for some types of domain interface. + + + Show per host cpu stats in all domain stats + + + Show stats provided in virDomainGetCPUStats in all domain stats + as well. + +
diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-dom= ain.h index e303140..2691ebe 100644 --- a/include/libvirt/libvirt-domain.h +++ b/include/libvirt/libvirt-domain.h @@ -2020,6 +2020,7 @@ typedef enum { VIR_DOMAIN_STATS_INTERFACE =3D (1 << 4), /* return domain interfaces i= nfo */ VIR_DOMAIN_STATS_BLOCK =3D (1 << 5), /* return domain block info */ VIR_DOMAIN_STATS_PERF =3D (1 << 6), /* return domain perf event info */ + VIR_DOMAIN_STATS_PER_CPU =3D (1 << 7), /* return domain per host CPU i= nfo */ } virDomainStatsTypes; =20 typedef enum { diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c index 5b3e842..3726938 100644 --- a/src/libvirt-domain.c +++ b/src/libvirt-domain.c @@ -11126,6 +11126,13 @@ virConnectGetDomainCapabilities(virConnectPtr conn, * "cpu.system" - system cpu time spent in nanoseconds as unsigned long * long. * + * VIR_DOMAIN_STATS_PER_CPU: + * Return per host CPU statistics + * "cpu.count" - number of host cpus + * "cpu..time" - total cpu time spent for this domain in nanoseco= nds + * "cpu..vtime" - time spent in virtual cpu threads for this doma= in + * in nanoseconds + * * VIR_DOMAIN_STATS_BALLOON: * Return memory balloon device information. * The typed parameter keys are in this format: diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 088f55e..d457a71 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -18806,6 +18806,69 @@ qemuDomainGetStatsCpu(virQEMUDriverPtr driver ATTR= IBUTE_UNUSED, } =20 static int +qemuDomainGetStatsPerCpu(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, + virDomainObjPtr dom, + virDomainStatsRecordPtr record, + int *maxparams, + unsigned int privflags ATTRIBUTE_UNUSED) +{ + qemuDomainObjPrivatePtr priv =3D dom->privateData; + virCgroupCpuStats stats =3D {0}; + virBitmapPtr guestvcpus =3D NULL; + char param_name[VIR_TYPED_PARAM_FIELD_LENGTH]; + int ncpus; + size_t i; + int ret =3D -1; + + if (qemuDomainHasVcpuPids(dom)) + guestvcpus =3D virDomainDefGetOnlineVcpumap(dom->def); + + ncpus =3D virCgroupGetCpuStats(priv->cgroup, guestvcpus, &stats); + + if (ncpus > 0) { + if (virTypedParamsAddUInt(&record->params, + &record->nparams, + maxparams, + "cpu.count", + ncpus) < 0) + goto cleanup; + + for (i =3D 0; i < ncpus; i++) { + snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH, + "cpu.%zu.time", i); + if (virTypedParamsAddULLong(&record->params, + &record->nparams, + maxparams, + param_name, + stats.time[i]) < 0) + goto cleanup; + + + if (stats.vtime) { + snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH, + "cpu.%zu.vtime", i); + if (virTypedParamsAddULLong(&record->params, + &record->nparams, + maxparams, + param_name, + stats.vtime[i]) < 0) + goto cleanup; + } + } + } + + ret =3D 0; + + cleanup: + if (!ret && virGetLastError()) + virResetLastError(); + virBitmapFree(guestvcpus); + virCgroupCpuStatsFree(&stats); + + return ret; +} + +static int qemuDomainGetStatsBalloon(virQEMUDriverPtr driver, virDomainObjPtr dom, virDomainStatsRecordPtr record, @@ -19381,6 +19444,7 @@ struct qemuDomainGetStatsWorker { static struct qemuDomainGetStatsWorker qemuDomainGetStatsWorkers[] =3D { { qemuDomainGetStatsState, VIR_DOMAIN_STATS_STATE, false }, { qemuDomainGetStatsCpu, VIR_DOMAIN_STATS_CPU_TOTAL, false }, + { qemuDomainGetStatsPerCpu, VIR_DOMAIN_STATS_PER_CPU, false }, { qemuDomainGetStatsBalloon, VIR_DOMAIN_STATS_BALLOON, true }, { qemuDomainGetStatsVcpu, VIR_DOMAIN_STATS_VCPU, true }, { qemuDomainGetStatsInterface, VIR_DOMAIN_STATS_INTERFACE, false }, diff --git a/tools/virsh-domain-monitor.c b/tools/virsh-domain-monitor.c index 77aa272..7707a96 100644 --- a/tools/virsh-domain-monitor.c +++ b/tools/virsh-domain-monitor.c @@ -1953,6 +1953,10 @@ static const vshCmdOptDef opts_domstats[] =3D { .type =3D VSH_OT_BOOL, .help =3D N_("report domain physical cpu usage"), }, + {.name =3D "per-cpu", + .type =3D VSH_OT_BOOL, + .help =3D N_("report domain per physical cpu usage"), + }, {.name =3D "balloon", .type =3D VSH_OT_BOOL, .help =3D N_("report domain balloon statistics"), @@ -2072,6 +2076,9 @@ cmdDomstats(vshControl *ctl, const vshCmd *cmd) if (vshCommandOptBool(cmd, "cpu-total")) stats |=3D VIR_DOMAIN_STATS_CPU_TOTAL; =20 + if (vshCommandOptBool(cmd, "per-cpu")) + stats |=3D VIR_DOMAIN_STATS_PER_CPU; + if (vshCommandOptBool(cmd, "balloon")) stats |=3D VIR_DOMAIN_STATS_BALLOON; =20 diff --git a/tools/virsh.pod b/tools/virsh.pod index a470409..c10a4ee 100644 --- a/tools/virsh.pod +++ b/tools/virsh.pod @@ -860,8 +860,9 @@ I for disk snapshots) will accept eith= er target or unique source names printed by this command. =20 =3Ditem B [I<--raw>] [I<--enforce>] [I<--backing>] [I<--state>] -[I<--cpu-total>] [I<--balloon>] [I<--vcpu>] [I<--interface>] [I<--block>] -[I<--perf>] [[I<--list-active>] [I<--list-inactive>] [I<--list-persistent>] +[I<--cpu-total>] [I<--per-cpu>] [I<--balloon>] [I<--vcpu>] [I<--interface>] +[I<--block>] [I<--perf>] +[[I<--list-active>] [I<--list-inactive>] [I<--list-persistent>] [I<--list-transient>] [I<--list-running>] [I<--list-paused>] [I<--list-shutoff>] [I<--list-other>]] | [I ...] =20 @@ -894,6 +895,12 @@ I<--cpu-total> returns: "cpu.user" - user cpu time spent in nanoseconds, "cpu.system" - system cpu time spent in nanoseconds =20 +I<--per-cpu> returns: +"cpu.count" - number of host cpus, +"cpu..time" - total cpu time spent for this domain in nanoseconds, +"cpu..vtime" - time spent in virtual cpu threads for this domain +in nanoseconds. + I<--balloon> returns: "balloon.current" - the memory in kiB currently used, "balloon.maximum" - the maximum memory in kiB allowed, --=20 1.8.3.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list