]> granicus.if.org Git - procps-ng/commitdiff
top: tweak the new 'reduce % CPU distortions' algorithm
authorJim Warner <james.warner@comcast.net>
Tue, 7 Feb 2012 16:10:10 +0000 (10:10 -0600)
committerCraig Small <csmall@enc.com.au>
Wed, 8 Feb 2012 10:00:00 +0000 (21:00 +1100)
The original approach to potential % CPU distortion due
to Nehalem type cores being turned off completely when
idle worked ok until the user typed something.

At that point, elapsed tics would no longer equal the
calculated value producing an undesirable 100% idle
condition until the next update or <Enter/Space> key.

This commit employs actual elapsed tics in determining
whether a cpu should be considered idle and thus makes
top's individual cpu display immune to user keystrokes.

top/top.c
top/top.h

index 8d24962e4606f98e9452ca00d8e30c5726deb44b..45835052466498bf2f7b09bdeaa19b3e4ca784e2 100644 (file)
--- a/top/top.c
+++ b/top/top.c
@@ -1823,6 +1823,9 @@ static CPU_t *cpus_refresh (CPU_t *cpus) {
       , &cpus[Cpu_faux_tot].cur.i, &cpus[Cpu_faux_tot].cur.w, &cpus[Cpu_faux_tot].cur.x
       , &cpus[Cpu_faux_tot].cur.y, &cpus[Cpu_faux_tot].cur.z))
          error_exit(N_txt(FAIL_statget_txt));
+   cpus[Cpu_faux_tot].cur.tot = cpus[Cpu_faux_tot].cur.u + cpus[Cpu_faux_tot].cur.s
+      + cpus[Cpu_faux_tot].cur.n + cpus[Cpu_faux_tot].cur.i + cpus[Cpu_faux_tot].cur.w
+      + cpus[Cpu_faux_tot].cur.x + cpus[Cpu_faux_tot].cur.y + cpus[Cpu_faux_tot].cur.z;
 
    // now value each separate cpu's tics, maybe
    for (i = 0; i < Cpu_faux_tot && i < Screen_rows; i++) {
@@ -1841,6 +1844,9 @@ static CPU_t *cpus_refresh (CPU_t *cpus) {
             memmove(&cpus[i], &cpus[Cpu_faux_tot], sizeof(CPU_t));
             break;        // tolerate cpus taken offline
       }
+      cpus[i].cur.tot = cpus[i].cur.u + cpus[i].cur.s
+         + cpus[i].cur.n + cpus[i].cur.i + cpus[i].cur.w
+         + cpus[i].cur.x + cpus[i].cur.y + cpus[i].cur.z;
 #ifdef PRETEND4CPUS
       cpus[i].id = i;
 #endif
@@ -3332,7 +3338,7 @@ static void summaryhlp (CPU_t *cpu, const char *pfx) {
 #ifdef CPU_ZEROTICS
    if (1 > tot_frme) tot_frme = 1;
 #else
-   if (tot_frme < ((smp_num_cpus * 10) * Rc.delay_time))
+   if (tot_frme < (cpu->cur.tot - cpu->sav.tot) / 10)
       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
index c4daa1bb559387b07114b01b36f9d5595ae3c809..fda844126a875b404e29af602b803f53d4920742 100644 (file)
--- a/top/top.h
+++ b/top/top.h
@@ -214,6 +214,7 @@ typedef struct CT_t {
       2.6.0  kernel: x == hi (hardware irq time), y == si (software irq time)
       2.6.11 kernel: z == st (virtual steal time) */
    TIC_t u, n, s, i, w, x, y, z;  // as represented in /proc/stat
+   SIC_t tot;                     // total of above
 } CT_t;
 
 typedef struct CPU_t {