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

Reply via email to