From 3442cec3872d6c07eda21d147ebdd35ef2fea620 Mon Sep 17 00:00:00 2001 From: Sebastien GODARD Date: Sat, 27 May 2023 16:31:05 +0200 Subject: [PATCH] iostat: Try to avoid some more negative values (#355) Signed-off-by: Sebastien GODARD Reference:https://github.com/sysstat/sysstat/commit/3442cec3872d6c07eda21d147ebdd35ef2fea620 Conflict:NA --- iostat.c | 40 +++++++++++++++++++++++++++++----------- rd_stats.c | 4 ++-- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/iostat.c b/iostat.c index 23b12f7..04b6ae3 100644 --- a/iostat.c +++ b/iostat.c @@ -970,6 +970,8 @@ void write_plain_ext_stat(unsigned long long itv, int fctr, int hpart, if (DISPLAY_SHORT_OUTPUT(flags)) { /* tps */ cprintf_f(NO_UNIT, 1, 8, 2, + ioi->rd_ios + ioi->wr_ios + ioi->dc_ios < ioj->rd_ios + ioj->wr_ios + ioj->dc_ios ? + 0.0 : S_VALUE(ioj->rd_ios + ioj->wr_ios + ioj->dc_ios, ioi->rd_ios + ioi->wr_ios + ioi->dc_ios, itv)); /* kB/s */ @@ -980,6 +982,8 @@ void write_plain_ext_stat(unsigned long long itv, int fctr, int hpart, xios->sectors); /* rqm/s */ cprintf_f(NO_UNIT, 1, 8, 2, + ioi->rd_merges + ioi->wr_merges + ioi->dc_merges < ioj->rd_merges + ioj->wr_merges + ioj->dc_merges ? + 0.0 : S_VALUE(ioj->rd_merges + ioj->wr_merges + ioj->dc_merges, ioi->rd_merges + ioi->wr_merges + ioi->dc_merges, itv)); /* await */ @@ -990,6 +994,7 @@ void write_plain_ext_stat(unsigned long long itv, int fctr, int hpart, xds->arqsz / 2); /* aqu-sz */ cprintf_f(NO_UNIT, 1, 7, 2, + ioi->rq_ticks < ioj->rq_ticks ? 0.0 : S_VALUE(ioj->rq_ticks, ioi->rq_ticks, itv) / 1000.0); /* * %util @@ -1011,6 +1016,7 @@ void write_plain_ext_stat(unsigned long long itv, int fctr, int hpart, xios->rsectors); /* rrqm/s */ cprintf_f(NO_UNIT, 1, 8, 2, + ioi->rd_merges < ioj->rd_merges ? 0.0 : S_VALUE(ioj->rd_merges, ioi->rd_merges, itv)); /* %rrqm */ cprintf_pc(DISPLAY_UNIT(flags), 1, 6, 2, @@ -1035,6 +1041,7 @@ void write_plain_ext_stat(unsigned long long itv, int fctr, int hpart, xios->wsectors); /* wrqm/s */ cprintf_f(NO_UNIT, 1, 8, 2, + ioi->wr_merges < ioj->wr_merges ? 0.0 : S_VALUE(ioj->wr_merges, ioi->wr_merges, itv)); /* %wrqm */ cprintf_pc(DISPLAY_UNIT(flags), 1, 6, 2, @@ -1059,6 +1066,7 @@ void write_plain_ext_stat(unsigned long long itv, int fctr, int hpart, xios->dsectors); /* drqm/s */ cprintf_f(NO_UNIT, 1, 8, 2, + ioi->dc_merges < ioj->dc_merges ? 0.0 : S_VALUE(ioj->dc_merges, ioi->dc_merges, itv)); /* %drqm */ cprintf_pc(DISPLAY_UNIT(flags), 1, 6, 2, @@ -1073,6 +1081,7 @@ void write_plain_ext_stat(unsigned long long itv, int fctr, int hpart, if ((hpart == 4) || !hpart) { /* aqu-sz */ cprintf_f(NO_UNIT, 1, 7, 2, + ioi->rq_ticks < ioj->rq_ticks ? 0.0 : S_VALUE(ioj->rq_ticks, ioi->rq_ticks, itv) / 1000.0); /* * %util @@ -1129,6 +1138,8 @@ void write_json_ext_stat(int tab, unsigned long long itv, int fctr, if (DISPLAY_SHORT_OUTPUT(flags)) { printf("\"tps\": %.2f, \"", + ioi->rd_ios + ioi->wr_ios + ioi->dc_ios < ioj->rd_ios + ioj->wr_ios + ioj->dc_ios ? + 0.0 : S_VALUE(ioj->rd_ios + ioj->wr_ios + ioj->dc_ios, ioi->rd_ios + ioi->wr_ios + ioi->dc_ios, itv)); if (DISPLAY_MEGABYTES(flags)) { @@ -1143,11 +1154,14 @@ void write_json_ext_stat(int tab, unsigned long long itv, int fctr, printf("\": %.2f, \"rqm/s\": %.2f, \"await\": %.2f, " "\"areq-sz\": %.2f, \"aqu-sz\": %.2f, ", xios->sectors /= fctr, + ioi->rd_merges + ioi->wr_merges + ioi->dc_merges < ioj->rd_merges + ioj->wr_merges + ioj->dc_merges ? + 0.0 : S_VALUE(ioj->rd_merges + ioj->wr_merges + ioj->dc_merges, ioi->rd_merges + ioi->wr_merges + ioi->dc_merges, itv), xds->await, xds->arqsz / 2, - S_VALUE(ioj->rq_ticks, ioi->rq_ticks, itv) / 1000.0); + ioi->rq_ticks < ioj->rq_ticks ? 0.0 + : S_VALUE(ioj->rq_ticks, ioi->rq_ticks, itv) / 1000.0); } else { printf("\"r/s\": %.2f, \"w/s\": %.2f, \"d/s\": %.2f, ", @@ -1175,9 +1189,12 @@ void write_json_ext_stat(int tab, unsigned long long itv, int fctr, "\"r_await\": %.2f, \"w_await\": %.2f, \"d_await\": %.2f, " "\"rareq-sz\": %.2f, \"wareq-sz\": %.2f, \"dareq-sz\": %.2f, " "\"aqu-sz\": %.2f, ", - S_VALUE(ioj->rd_merges, ioi->rd_merges, itv), - S_VALUE(ioj->wr_merges, ioi->wr_merges, itv), - S_VALUE(ioj->dc_merges, ioi->dc_merges, itv), + ioi->rd_merges < ioj->rd_merges ? 0.0 + : S_VALUE(ioj->rd_merges, ioi->rd_merges, itv), + ioi->wr_merges < ioj->wr_merges ? 0.0 + : S_VALUE(ioj->wr_merges, ioi->wr_merges, itv), + ioi->dc_merges < ioj->dc_merges ? 0.0 + : S_VALUE(ioj->dc_merges, ioi->dc_merges, itv), xios->rrqm_pc, xios->wrqm_pc, xios->drqm_pc, @@ -1187,7 +1204,8 @@ void write_json_ext_stat(int tab, unsigned long long itv, int fctr, xios->rarqsz / 2, xios->warqsz / 2, xios->darqsz / 2, - S_VALUE(ioj->rq_ticks, ioi->rq_ticks, itv) / 1000.0); + ioi->rq_ticks < ioj->rq_ticks ? 0.0 + : S_VALUE(ioj->rq_ticks, ioi->rq_ticks, itv) / 1000.0); } if (d->dev_tp > T_GROUP) { @@ -1286,11 +1304,11 @@ void write_ext_stat(unsigned long long itv, int fctr, int hpart, ((ioi->rd_merges - ioj->rd_merges) + (ioi->rd_ios - ioj->rd_ios)) * 100 : 0.0; /* r_await */ - xios.r_await = (ioi->rd_ios - ioj->rd_ios) ? + xios.r_await = (ioi->rd_ios > ioj->rd_ios) ? (ioi->rd_ticks - ioj->rd_ticks) / ((double) (ioi->rd_ios - ioj->rd_ios)) : 0.0; /* rareq-sz (still in sectors, not kB) */ - xios.rarqsz = (ioi->rd_ios - ioj->rd_ios) ? + xios.rarqsz = (ioi->rd_ios > ioj->rd_ios) ? (ioi->rd_sectors - ioj->rd_sectors) / ((double) (ioi->rd_ios - ioj->rd_ios)) : 0.0; } @@ -1301,11 +1319,11 @@ void write_ext_stat(unsigned long long itv, int fctr, int hpart, ((ioi->wr_merges - ioj->wr_merges) + (ioi->wr_ios - ioj->wr_ios)) * 100 : 0.0; /* w_await */ - xios.w_await = (ioi->wr_ios - ioj->wr_ios) ? + xios.w_await = (ioi->wr_ios > ioj->wr_ios) ? (ioi->wr_ticks - ioj->wr_ticks) / ((double) (ioi->wr_ios - ioj->wr_ios)) : 0.0; /* wareq-sz (still in sectors, not kB) */ - xios.warqsz = (ioi->wr_ios - ioj->wr_ios) ? + xios.warqsz = (ioi->wr_ios > ioj->wr_ios) ? (ioi->wr_sectors - ioj->wr_sectors) / ((double) (ioi->wr_ios - ioj->wr_ios)) : 0.0; } @@ -1316,11 +1334,11 @@ void write_ext_stat(unsigned long long itv, int fctr, int hpart, ((ioi->dc_merges - ioj->dc_merges) + (ioi->dc_ios - ioj->dc_ios)) * 100 : 0.0; /* d_await */ - xios.d_await = (ioi->dc_ios - ioj->dc_ios) ? + xios.d_await = (ioi->dc_ios > ioj->dc_ios) ? (ioi->dc_ticks - ioj->dc_ticks) / ((double) (ioi->dc_ios - ioj->dc_ios)) : 0.0; /* dareq-sz (still in sectors, not kB) */ - xios.darqsz = (ioi->dc_ios - ioj->dc_ios) ? + xios.darqsz = (ioi->dc_ios > ioj->dc_ios) ? (ioi->dc_sectors - ioj->dc_sectors) / ((double) (ioi->dc_ios - ioj->dc_ios)) : 0.0; } diff --git a/rd_stats.c b/rd_stats.c index fcae43e..610b843 100644 --- a/rd_stats.c +++ b/rd_stats.c @@ -376,10 +376,10 @@ void compute_ext_disk_stats(struct stats_disk *sdc, struct stats_disk *sdp, * Kernel gives ticks already in milliseconds for all platforms * => no need for further scaling. */ - xds->await = (sdc->nr_ios - sdp->nr_ios) ? + xds->await = (sdc->nr_ios > sdp->nr_ios) ? ((sdc->rd_ticks - sdp->rd_ticks) + (sdc->wr_ticks - sdp->wr_ticks) + (sdc->dc_ticks - sdp->dc_ticks)) / ((double) (sdc->nr_ios - sdp->nr_ios)) : 0.0; - xds->arqsz = (sdc->nr_ios - sdp->nr_ios) ? + xds->arqsz = (sdc->nr_ios > sdp->nr_ios) ? ((sdc->rd_sect - sdp->rd_sect) + (sdc->wr_sect - sdp->wr_sect) + (sdc->dc_sect - sdp->dc_sect)) / ((double) (sdc->nr_ios - sdp->nr_ios)) : 0.0; } -- 2.33.0