From f432014308d6b21386e15affbbca62043615671d Mon Sep 17 00:00:00 2001 From: phk Date: Sat, 15 Mar 2003 21:59:06 +0000 Subject: Run a revision of the devstat interface: Kernel: Change statistics to use the *uptime() timescale (ie: relative to boottime) rather than the UTC aligned timescale. This makes the device statistics code oblivious to clock steps. Change timestamps to bintime format, they are cheaper. Remove the "busy_count", and replace it with two counter fields: "start_count" and "end_count", which are updated in the down and up paths respectively. This removes the locking constraint on devstat. Add a timestamp argument to devstat_start_transaction(), this will normally be a timestamp set by the *_bio() function in bp->bio_t0. Use this field to calculate duration of I/O operations. Add two timestamp arguments to devstat_end_transaction(), one is the current time, a NULL pointer means "take timestamp yourself", the other is the timestamp of when this transaction started (see above). Change calculation of busy_time to operate on "the salami principle": Only when we are idle, which we can determine by the start+end counts being identical, do we update the "busy_from" field in the down path. In the up path we accumulate the timeslice in busy_time and update busy_from. Change the byte_* and num_* fields into two arrays: bytes[] and operations[]. Userland: Change the misleading "busy_time" name to be called "snap_time" and make the time long double since that is what most users need anyway, fill it using clock_gettime(CLOCK_MONOTONIC) to put it on the same timescale as the kernel fields. Change devstat_compute_etime() to operate on struct bintime. Remove the version 2 legacy interface: the change to bintime makes compatibility far too expensive. Fix a bug in systat's "vm" page where boot relative busy times would be bogus. Bump __FreeBSD_version to 500107 Review & Collaboration by: ken --- usr.sbin/iostat/iostat.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) (limited to 'usr.sbin/iostat') diff --git a/usr.sbin/iostat/iostat.c b/usr.sbin/iostat/iostat.c index 3370df2..724756e 100644 --- a/usr.sbin/iostat/iostat.c +++ b/usr.sbin/iostat/iostat.c @@ -407,12 +407,10 @@ main(int argc, char **argv) cur.tk_nin = 0; /* - * Set the busy time to the system boot time, so the stats are - * calculated since system boot. + * Set the snap time to the system boot time (ie: zero), so the + * stats are calculated since system boot. */ - if (readvar(kd, "kern.boottime", X_BOOTTIME, &cur.busy_time, - sizeof(cur.busy_time)) != 0) - exit(1); + cur.snap_time = 0; /* * If the user stops the program (control-Z) and then resumes it, @@ -452,7 +450,7 @@ main(int argc, char **argv) last.dinfo = cur.dinfo; cur.dinfo = tmp_dinfo; - last.busy_time = cur.busy_time; + last.snap_time = cur.snap_time; /* * Here what we want to do is refresh our device stats. @@ -538,7 +536,7 @@ main(int argc, char **argv) last.tk_nout = tmp; } - etime = devstat_compute_etime(cur.busy_time, last.busy_time); + etime = cur.snap_time - last.snap_time; if (etime == 0.0) etime = 1.0; -- cgit v1.1