From 9ce4c1e97d581999f40d936837734fd4fe9fe761 Mon Sep 17 00:00:00 2001 From: lingsheng <860373352@qq.com> Date: Mon, 24 Mar 2025 17:27:41 +0800 Subject: [PATCH] avoid util over 100 --- avoid-util-over-100.patch | 140 ++++++++++++++++++++++++++++++++++++++ sysstat.spec | 6 +- 2 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 avoid-util-over-100.patch diff --git a/avoid-util-over-100.patch b/avoid-util-over-100.patch new file mode 100644 index 0000000..e1f579f --- /dev/null +++ b/avoid-util-over-100.patch @@ -0,0 +1,140 @@ +From fa763bcd64be36eb0a7c74ac3c9f95edec1b22d3 Mon Sep 17 00:00:00 2001 +From: zhujunhao +Date: Mon, 24 Mar 2025 13:55:06 +0800 +Subject: [PATCH] avoid util over 100 + +--- + iostat.c | 46 +++++++++++++++++----------------------------- + rd_stats.c | 3 +++ + 2 files changed, 20 insertions(+), 29 deletions(-) + +diff --git a/iostat.c b/iostat.c +index d6f0664..c22c8ad 100644 +--- a/iostat.c ++++ b/iostat.c +@@ -1161,8 +1161,6 @@ void write_plain_ext_stat(unsigned long long itv, int fctr, int hpart, + struct io_stats *ioj, char *devname, struct ext_disk_stats *xds, + struct ext_io_stats *xios) + { +- int n; +- + /* If this is a group with no devices, skip it */ + if (d->dev_tp == T_GROUP) + return; +@@ -1171,14 +1169,6 @@ void write_plain_ext_stat(unsigned long long itv, int fctr, int hpart, + cprintf_in(IS_STR, "%-13s", devname, 0); + } + +- /* Compute number of devices in group */ +- if (d->dev_tp > T_GROUP) { +- n = d->dev_tp - T_GROUP; +- } +- else { +- n = 1; +- } +- + if (DISPLAY_SHORT_OUTPUT(flags)) { + /* tps */ + /* Origin (unmerged) flush operations are counted as writes */ +@@ -1213,7 +1203,7 @@ void write_plain_ext_stat(unsigned long long itv, int fctr, int hpart, + * %util + * Again: Ticks in milliseconds. + */ +- cprintf_xpc(DISPLAY_UNIT(flags), XHIGH, 1, 6, 2, xds->util / 10.0 / (double) n); ++ cprintf_xpc(DISPLAY_UNIT(flags), XHIGH, 1, 6, 2, xds->util / 10.0); + } + else { + if ((hpart == 1) || !hpart) { +@@ -1307,13 +1297,7 @@ void write_plain_ext_stat(unsigned long long itv, int fctr, int hpart, + * %util + * Again: Ticks in milliseconds. + */ +- if (d->dev_tp > T_GROUP) { +- n = d->dev_tp - T_GROUP; +- } +- else { +- n = 1; +- } +- cprintf_xpc(DISPLAY_UNIT(flags), XHIGH, 1, 6, 2, xds->util / 10.0 / (double) n); ++ cprintf_xpc(DISPLAY_UNIT(flags), XHIGH, 1, 6, 2, xds->util / 10.0); + } + } + +@@ -1345,8 +1329,6 @@ void write_json_ext_stat(int tab, unsigned long long itv, int fctr, + struct io_stats *ioj, char *devname, struct ext_disk_stats *xds, + struct ext_io_stats *xios) + { +- int n; +- + /* If this is a group with no devices, skip it */ + if (d->dev_tp == T_GROUP) + return; +@@ -1433,13 +1415,7 @@ void write_json_ext_stat(int tab, unsigned long long itv, int fctr, + : S_VALUE(ioj->rq_ticks, ioi->rq_ticks, itv) / 1000.0); + } + +- if (d->dev_tp > T_GROUP) { +- n = d->dev_tp - T_GROUP; +- } +- else { +- n = 1; +- } +- printf("\"util\": %.2f}", xds->util / 10.0 / (double) n); ++ printf("\"util\": %.2f}", xds->util / 10.0); + } + + /* +@@ -1467,10 +1443,19 @@ void write_ext_stat(unsigned long long itv, int fctr, int hpart, + struct stats_disk sdc, sdp; + struct ext_disk_stats xds; + struct ext_io_stats xios; ++ int n; + + memset(&xds, 0, sizeof(struct ext_disk_stats)); + memset(&xios, 0, sizeof(struct ext_io_stats)); + ++ /* Compute number of devices in group */ ++ if (d->dev_tp > T_GROUP) { ++ n = d->dev_tp - T_GROUP; ++ } ++ else { ++ n = 1; ++ } ++ + /* + * Counters overflows are possible, but don't need to be handled in + * a special way: The difference is still properly calculated if the +@@ -1486,8 +1471,11 @@ void write_ext_stat(unsigned long long itv, int fctr, int hpart, + sdc.nr_ios = ioi->rd_ios + ioi->wr_ios + ioi->dc_ios; + sdp.nr_ios = ioj->rd_ios + ioj->wr_ios + ioj->dc_ios; + +- sdc.tot_ticks = ioi->tot_ticks; +- sdp.tot_ticks = ioj->tot_ticks; ++ sdc.tot_ticks = ioi->tot_ticks / n; ++ sdp.tot_ticks = ioj->tot_ticks / n; ++ ++ sdc.rq_ticks = ioi->rq_ticks; ++ sdp.rq_ticks = ioj->rq_ticks; + + sdc.rd_ticks = ioi->rd_ticks; + sdp.rd_ticks = ioj->rd_ticks; +diff --git a/rd_stats.c b/rd_stats.c +index c414149..73050a9 100644 +--- a/rd_stats.c ++++ b/rd_stats.c +@@ -448,9 +448,12 @@ void read_uptime(unsigned long long *uptime) + void compute_ext_disk_stats(struct stats_disk *sdc, struct stats_disk *sdp, + unsigned long long itv, struct ext_disk_stats *xds) + { ++ double aqu_sz = S_VALUE(sdp->rq_ticks, sdc->rq_ticks, itv) / 1000.0; + xds->util = sdc->tot_ticks < sdp->tot_ticks ? + 0.0 : + S_VALUE(sdp->tot_ticks, sdc->tot_ticks, itv); ++ /* avoid util over 100 */ ++ xds->util = MINIMUM(xds->util, MINIMUM(aqu_sz, 1.0) * 1000); + /* + * Kernel gives ticks already in milliseconds for all platforms + * => no need for further scaling. +-- +2.33.0 + diff --git a/sysstat.spec b/sysstat.spec index 86728c0..adcf4d8 100644 --- a/sysstat.spec +++ b/sysstat.spec @@ -1,6 +1,6 @@ Name: sysstat Version: 12.7.7 -Release: 1 +Release: 2 Summary: System performance tools for the Linux operating system License: GPLv2+ URL: http://sebastien.godard.pagesperso-orange.fr/ @@ -14,6 +14,7 @@ Requires(preun): systemd Requires(postun): systemd Patch9000: bugfix-sysstat-10.1.5-read-ttyAMA-first-for-arm64.patch +Patch9001: avoid-util-over-100.patch %description The sysstat package contains various utilities, common to many commercial @@ -88,6 +89,9 @@ fi %{_mandir}/man*/* %changelog +* Mon Mar 24 2025 lingsheng - 12.7.7-2 +- avoid util over 100 + * Fri Feb 07 2025 maqi - 12.7.7-1 - update to 12.7.7 -- Gitee