]> granicus.if.org Git - procps-ng/commitdiff
top: reduce % CPU distortions when a core was turned off
authorJim Warner <james.warner@comcast.net>
Fri, 3 Feb 2012 06:00:00 +0000 (00:00 -0600)
committerCraig Small <csmall@enc.com.au>
Wed, 8 Feb 2012 09:57:58 +0000 (20:57 +1100)
This patch provides for cpu cores which can be turned
off completely when idle (Nehalem, etc.) thus registering
very few or no tics since the last update cycle.

When CPU_ZEROTICS is not defined (the default), any
displayed cpu with less than a certain amount of total
tics will show as 100% idle.  That amount is tempered
by the delay interval and total number of cpus.

This commit also satisfies the Debian 'top_nohz' patch
(11/24/09) in a slightly more efficient manner.  That
patch concerned kernels built with CONFIG_NO_HZ.

Reference:
http://www.freelists.org/post/procps/CStates-handling-new-switch,4

top/top.c
top/top.h

index 172507f8044362eff3862ae2b1f9593064ac5203..8d24962e4606f98e9452ca00d8e30c5726deb44b 100644 (file)
--- a/top/top.c
+++ b/top/top.c
@@ -3324,13 +3324,18 @@ static void summaryhlp (CPU_t *cpu, const char *pfx) {
    s_frme = TRIMz(cpu->cur.s - cpu->sav.s);
    n_frme = TRIMz(cpu->cur.n - cpu->sav.n);
    i_frme = TRIMz(cpu->cur.i - cpu->sav.i);
-   if ((u_frme == 0) && (i_frme == 0)) i_frme = 100;
    w_frme = TRIMz(cpu->cur.w - cpu->sav.w);
    x_frme = TRIMz(cpu->cur.x - cpu->sav.x);
    y_frme = TRIMz(cpu->cur.y - cpu->sav.y);
    z_frme = TRIMz(cpu->cur.z - cpu->sav.z);
    tot_frme = u_frme + s_frme + n_frme + i_frme + w_frme + x_frme + y_frme + z_frme;
+#ifdef CPU_ZEROTICS
    if (1 > tot_frme) tot_frme = 1;
+#else
+   if (tot_frme < ((smp_num_cpus * 10) * Rc.delay_time))
+      tot_frme = u_frme = s_frme = n_frme = i_frme = w_frme = x_frme = y_frme = z_frme = 0;
+   if (1 > tot_frme) i_frme = tot_frme = 1;
+#endif
    scale = 100.0 / (float)tot_frme;
 
    /* display some kinda' cpu state percentages
index 0abf9552fd23d8f9035dfac55914793ff186675c..c4daa1bb559387b07114b01b36f9d5595ae3c809 100644 (file)
--- a/top/top.h
+++ b/top/top.h
@@ -27,6 +27,7 @@
 //#define ATEOJ_RPTSTD            /* report on misc stuff, at end-of-job     */
 //#define CASEUP_HEXES            /* show any hex values in upper case       */
 //#define CASEUP_SUFIX            /* show time/mem/cnts suffix in upper case */
+//#define CPU_ZEROTICS            /* tolerate few tics when cpu off vs. idle */
 //#define EQUCOLHDRYES            /* yes, do equalize column header lengths  */
 //#define OFF_HST_HASH            /* use BOTH qsort+bsrch vs. hashing scheme */
 //#define OFF_STDIOLBF            /* disable our own stdout _IOFBF override  */