From: Jim Warner Date: Tue, 7 Feb 2012 16:10:10 +0000 (-0600) Subject: top: tweak the new 'reduce % CPU distortions' algorithm X-Git-Tag: v3.3.3~91 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9e7dd43ab7b2e68177cefd49b3c07311ea79bc1a;p=procps-ng top: tweak the new 'reduce % CPU distortions' algorithm 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 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. --- diff --git a/top/top.c b/top/top.c index 8d24962e..45835052 100644 --- 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 diff --git a/top/top.h b/top/top.h index c4daa1bb..fda84412 100644 --- 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 {