Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 17 Oct 2007 13:48:53 GMT
From:      Marko Zec <zec@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 127628 for review
Message-ID:  <200710171348.l9HDmrqt080484@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=127628

Change 127628 by zec@zec_tpx32 on 2007/10/17 13:48:29

	Improve accuracy of per process group CPU average usage
	accounting and reporting, and slightly increase deccay
	periods.

Affected files ...

.. //depot/projects/vimage/src/sys/kern/kern_clock.c#11 edit
.. //depot/projects/vimage/src/sys/kern/kern_vimage.c#46 edit
.. //depot/projects/vimage/src/usr.sbin/vimage/vimage.c#6 edit

Differences ...

==== //depot/projects/vimage/src/sys/kern/kern_clock.c#11 (text+ko) ====

@@ -484,21 +484,25 @@
 	tot_acc_statcalls++;
 	if (!TD_IS_IDLETHREAD(td))
 		V_acc_statcalls++;
+
+	/* Deccay processing every 1/16 seconds */
 	if (last_acc_ticks + (hz >> 4) <= ticks) {
 		u_int weight_fixp;
 		u_int avg0;
 
 		last_acc_ticks = ticks;
 		/*
-		 * 0x10000 == 1.0 in 16:16 fixed point notation;
-		 * a few extra LS bits are added in an attempt to
-		 * compensate for truncation errors.
+		 * avg0, avg1 and avg2 are stored in 16.16 fixed point format.
+		 * weight_fixp is in 1.31 format for better accuracy.
+		 *
+		 * avg1 loses half of its value in roughly 150 ms.
+		 * avg2 loses half of its value in roughly 1350 ms.
 		 */
-		weight_fixp = 0x010007 / tot_acc_statcalls;
+		weight_fixp = 0x80000000 / tot_acc_statcalls;
 		LIST_FOREACH(vcpu, &vcpu_head, vcpu_le) {
-			avg0 = weight_fixp * V_acc_statcalls;
-			V_avg1_fixp = (V_avg1_fixp + avg0 + 1) >> 1;
-			V_avg2_fixp = (15 * V_avg2_fixp + avg0 + 15) >> 4;
+			avg0 = (weight_fixp * V_acc_statcalls) >> 15;
+			V_avg1_fixp = (3 * V_avg1_fixp + avg0) >> 2;
+			V_avg2_fixp = (31 * V_avg2_fixp + avg0) >> 5;
 			V_acc_statcalls = 0;
 		}
 		tot_acc_statcalls = 0;

==== //depot/projects/vimage/src/sys/kern/kern_vimage.c#46 (text+ko) ====

@@ -504,8 +504,7 @@
 		vi_req->vi_proc_count = vip_r->v_procg->nprocs;
 		vi_req->vi_if_count = vip_r->v_vnet->ifccnt;
 		vi_req->vi_sock_count = vip_r->v_vnet->sockcnt;
-		vi_req->cp_time_avg =
-		    (vip_r->v_cpu->_avg2_fixp * 10000 + 0x8000) >> 16;
+		vi_req->cp_time_avg = vip_r->v_cpu->_avg2_fixp;
 		break;
 
 	case SIOCSPVIMAGE:

==== //depot/projects/vimage/src/usr.sbin/vimage/vimage.c#6 (text+ko) ====

@@ -72,7 +72,7 @@
 		lf * vi_req->averunnable.ldavg[1],
 		lf * vi_req->averunnable.ldavg[2]);
 
-	printf("    CPU usage: %3.2f%%\n", 0.01 * vi_req->cp_time_avg);
+	printf("    CPU usage: %3.2f%%\n", vi_req->cp_time_avg / 655.04);
 
 	printf("    Sockets (cur/max): %d/%d;", vi_req->vi_sock_count,
 		vi_req->vi_maxsockets);



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