Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 27 Aug 2001 22:28:06 -0700
From:      mki <mki@mozone.net>
To:        freebsd-stable@freebsd.org
Subject:   thoughts on %busy in iostat
Message-ID:  <20010827222806.U1286@cyclonus.mozone.net>

next in thread | raw e-mail | index | archive | help
It would be cool if iostat would show %busy times, I managed
to get this into my local copy (see attached), by taking some
of the stuff off of systat.  Thoughts?

-mohan


--- /usr/src/usr.sbin/iostat/iostat.c	Thu Aug 16 18:33:52 2001
+++ iostat.c	Mon Aug 20 10:21:41 2001
@@ -563,14 +563,14 @@
 		 && (dev_select[i].selected <= maxshowdevs)) {
 			if (oflag > 0) {
 				if (Iflag == 0)
-					(void)printf(" sps tps msps ");
+					(void)printf(" sps tps msps %%b ");
 				else
-					(void)printf(" blk xfr msps ");
+					(void)printf(" blk xfr msps %%b ");
 			} else {
 				if (Iflag == 0)
-					printf("  KB/t tps  MB/s ");
+					printf("  KB/t tps  MB/s  %%b ");
 				else
-					printf("  KB/t xfrs   MB ");
+					printf("  KB/t xfrs   MB  %%b ");
 			}
 			printed++;
 		}
@@ -592,6 +592,7 @@
 	long double busy_seconds;
 	long double total_mb;
 	long double blocks_per_second, ms_per_transaction;
+	long double device_busy;
 	
 	/*
 	 * Calculate elapsed time up front, since it's the same for all
@@ -608,6 +609,9 @@
 
 		di = dev_select[dn].position;
 
+		device_busy = compute_etime(cur.dinfo->devices[di].busy_time, 
+		                            last.dinfo->devices[di].busy_time);
+
 		if (compute_stats(&cur.dinfo->devices[di],
 				  &last.dinfo->devices[di], busy_seconds,
 				  &total_bytes, &total_transfers,
@@ -629,35 +633,50 @@
 						       block_size : 512) / 1024;
 		}
 
+
+		if ((device_busy == 0) && (transfers_per_second > 5))
+			/* the device has been 100% busy, fake it because
+		 	 * as long as the device is 100% busy the busy_time
+			 * field in the devstat struct is not updated */
+			device_busy = busy_seconds;
+		if (device_busy > busy_seconds)
+			/* this normally happens after one or more periods
+			 * where the device has been 100% busy, correct it */
+			device_busy = busy_seconds;
+
 		if (oflag > 0) {
 			int msdig = (ms_per_transaction < 100.0) ? 1 : 0;
 
 			if (Iflag == 0)
-				printf("%4.0Lf%4.0Lf%5.*Lf ",
+				printf("%4.0Lf%4.0Lf%5.*Lf%4.0Lf%% ",
 				       blocks_per_second,
 				       transfers_per_second,
 				       msdig,
-				       ms_per_transaction);
+				       ms_per_transaction,
+				       device_busy*100/busy_seconds);
 			else 
-				printf("%4.1qu%4.1qu%5.*Lf ",
+				printf("%4.1qu%4.1qu%5.*Lf%4.0Lf%% ",
 				       total_blocks,
 				       total_transfers,
 				       msdig,
-				       ms_per_transaction);
+				       ms_per_transaction,
+				       device_busy*100/busy_seconds);
 		} else {
 			if (Iflag == 0)
-				printf(" %5.2Lf %3.0Lf %5.2Lf ", 
+				printf(" %5.2Lf %3.0Lf %5.2Lf%4.0Lf ", 
 				       kb_per_transfer,
 				       transfers_per_second,
-				       mb_per_second);
+				       mb_per_second,
+				       device_busy*100/busy_seconds);
 			else {
 				total_mb = total_bytes;
 				total_mb /= 1024 * 1024;
 
-				printf(" %5.2Lf %3.1qu %5.2Lf ", 
+				printf(" %5.2Lf %3.1qu %5.2Lf%4.0Lf ", 
 				       kb_per_transfer,
 				       total_transfers,
-				       total_mb);
+				       total_mb,
+				       device_busy*100/busy_seconds);
 			}
 		}
 	}

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-stable" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010827222806.U1286>