Module Name: src
Committed By: mlelstv
Date: Sat Jul 15 08:22:23 UTC 2017
Modified Files:
src/usr.bin/systat: iostat.c vmstat.c
Log Message:
Use I/O timestamps to compute disk statistics for better precisison.
To generate a diff of this commit:
cvs rdiff -u -r1.37 -r1.38 src/usr.bin/systat/iostat.c
cvs rdiff -u -r1.81 -r1.82 src/usr.bin/systat/vmstat.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/usr.bin/systat/iostat.c
diff -u src/usr.bin/systat/iostat.c:1.37 src/usr.bin/systat/iostat.c:1.38
--- src/usr.bin/systat/iostat.c:1.37 Mon Apr 13 23:20:27 2009
+++ src/usr.bin/systat/iostat.c Sat Jul 15 08:22:23 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: iostat.c,v 1.37 2009/04/13 23:20:27 lukem Exp $ */
+/* $NetBSD: iostat.c,v 1.38 2017/07/15 08:22:23 mlelstv Exp $ */
/*
* Copyright (c) 1980, 1992, 1993
@@ -34,7 +34,7 @@
#if 0
static char sccsid[] = "@(#)iostat.c 8.1 (Berkeley) 6/6/93";
#endif
-__RCSID("$NetBSD: iostat.c,v 1.37 2009/04/13 23:20:27 lukem Exp $");
+__RCSID("$NetBSD: iostat.c,v 1.38 2017/07/15 08:22:23 mlelstv Exp $");
#endif /* not lint */
#include <sys/param.h>
@@ -46,7 +46,7 @@ __RCSID("$NetBSD: iostat.c,v 1.37 2009/0
#include "drvstats.h"
static int linesperregion;
-static double etime;
+static double etime;
static int numbers = 0; /* default display bar graphs */
static int secs = 0; /* default seconds shown */
static int read_write = 0; /* default read/write shown */
@@ -252,9 +252,15 @@ showiostat(void)
static int
stats(int row, int col, int dn)
{
- double atime, rwords, wwords;
+ double atime, dtime, rwords, wwords;
uint64_t rxfer;
+ /* elapsed time for disk stats */
+ dtime = etime;
+ if (cur.timestamp[dn].tv_sec || cur.timestamp[dn].tv_usec)
+ dtime = (double)cur.timestamp[dn].tv_sec +
+ ((double)cur.timestamp[dn].tv_usec / (double)1000000);
+
/* time busy in disk activity */
atime = (double)cur.time[dn].tv_sec +
((double)cur.time[dn].tv_usec / (double)1000000);
@@ -269,30 +275,30 @@ stats(int row, int col, int dn)
}
if (numbers) {
mvwprintw(wnd, row, col, "%5.0f%4.0f",
- rwords / etime, rxfer / etime);
+ rwords / dtime, rxfer / dtime);
if (secs)
- wprintw(wnd, "%5.1f", atime / etime);
+ wprintw(wnd, "%5.1f", atime / dtime);
if (read_write)
wprintw(wnd, " %5.0f%4.0f",
- wwords / etime, cur.wxfer[dn] / etime);
+ wwords / dtime, cur.wxfer[dn] / dtime);
return (row);
}
wmove(wnd, row++, col);
- histogram(rwords / etime, 50, 0.5);
+ histogram(rwords / dtime, 50, 0.5);
wmove(wnd, row++, col);
- histogram(rxfer / etime, 50, 0.5);
+ histogram(rxfer / dtime, 50, 0.5);
if (read_write) {
wmove(wnd, row++, col);
- histogram(wwords / etime, 50, 0.5);
+ histogram(wwords / dtime, 50, 0.5);
wmove(wnd, row++, col);
- histogram(cur.wxfer[dn] / etime, 50, 0.5);
+ histogram(cur.wxfer[dn] / dtime, 50, 0.5);
}
if (secs) {
wmove(wnd, row++, col);
atime *= 1000; /* In milliseconds */
- histogram(atime / etime, 50, 0.5);
+ histogram(atime / dtime, 50, 0.5);
}
return (row);
}
Index: src/usr.bin/systat/vmstat.c
diff -u src/usr.bin/systat/vmstat.c:1.81 src/usr.bin/systat/vmstat.c:1.82
--- src/usr.bin/systat/vmstat.c:1.81 Wed Dec 24 20:01:22 2014
+++ src/usr.bin/systat/vmstat.c Sat Jul 15 08:22:23 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: vmstat.c,v 1.81 2014/12/24 20:01:22 dennis Exp $ */
+/* $NetBSD: vmstat.c,v 1.82 2017/07/15 08:22:23 mlelstv Exp $ */
/*-
* Copyright (c) 1983, 1989, 1992, 1993
@@ -34,7 +34,7 @@
#if 0
static char sccsid[] = "@(#)vmstat.c 8.2 (Berkeley) 1/12/94";
#endif
-__RCSID("$NetBSD: vmstat.c,v 1.81 2014/12/24 20:01:22 dennis Exp $");
+__RCSID("$NetBSD: vmstat.c,v 1.82 2017/07/15 08:22:23 mlelstv Exp $");
#endif /* not lint */
/*
@@ -827,24 +827,31 @@ copyinfo(struct Info *from, struct Info
static void
dinfo(int dn, int r, int c)
{
- double atime;
+ double atime, dtime;
#define ADV if (disk_horiz) r++; else c += DISKCOLWIDTH
+ /* elapsed time for disk stats */
+ dtime = etime;
+ if (cur.timestamp[dn].tv_sec || cur.timestamp[dn].tv_usec) {
+ dtime = (double)cur.timestamp[dn].tv_sec +
+ ((double)cur.timestamp[dn].tv_usec / (double)1000000);
+ }
+
mvprintw(r, c, "%*.*s", DISKCOLWIDTH, DISKCOLWIDTH, dr_name[dn]);
ADV;
- putint((int)(cur.seek[dn]/etime+0.5), r, c, DISKCOLWIDTH);
+ putint((int)(cur.seek[dn]/dtime+0.5), r, c, DISKCOLWIDTH);
ADV;
- putint((int)((cur.rxfer[dn]+cur.wxfer[dn])/etime+0.5),
+ putint((int)((cur.rxfer[dn]+cur.wxfer[dn])/dtime+0.5),
r, c, DISKCOLWIDTH);
ADV;
- puthumanint((cur.rbytes[dn] + cur.wbytes[dn]) / etime + 0.5,
+ puthumanint((cur.rbytes[dn] + cur.wbytes[dn]) / dtime + 0.5,
r, c, DISKCOLWIDTH);
ADV;
/* time busy in disk activity */
atime = cur.time[dn].tv_sec + cur.time[dn].tv_usec / 1000000.0;
- atime = atime * 100.0 / etime;
+ atime = atime * 100.0 / dtime;
if (atime >= 100)
putint(100, r, c, DISKCOLWIDTH);
else