top's CPUn vs C column
John Baldwin
jhb at freebsd.org
Mon Mar 4 19:49:05 UTC 2013
On Friday, March 01, 2013 1:17:41 pm Chris Ross wrote:
>
> So, I was looking at a v240 I have running stable/9 (9.1-STABLE), and
noticed something odd. The per-CPU information displayed by top seems
inconsistent. To simplify things, while I'm running a "make release" in
/usr/src/release, I just started running the following command over and over
(by hand):
>
> cross: top | grep " CPU"
> cross: top | grep " CPU"
> 1044 cross 1 72 0 17128K 4464K CPU1 0 0:01 1.27% zsh
> 22528 root 1 77 5 11672K 2592K CPU1 1 0:00 0.00% sh
> cross: top | grep " CPU"
> cross: top | grep " CPU"
> 22634 cross 1 72 0 12808K 2872K CPU1 1 0:00 0.00% top
> 22633 root 1 77 5 6272K 880K CPU0 1 0:00 0.00% make
> cross: top | grep " CPU"
> 22637 root 1 77 5 6272K 1656K CPU0 0 0:00 0.00% make
> cross: top | grep " CPU"
> cross: top | grep " CPU"
> 22684 root 1 77 5 11672K 2592K CPU0 0 0:00 0.00% sh
> cross:
>
> This displayed what I had earlier seen in the full-screen top. There
doesn't appear to be any specific binding between the "n" in the "CPUn" state
value, and the number in the "C" column, which is according to the man page,
should mean the same thing.
No, they are different things. The man page is a bit stale. The 'C' column
is the CPU that the process last ran on. Hmm, it's actually easiest to fix
the code I think. Try this (untested) change:
Index: usr.bin/top/machine.c
===================================================================
--- machine.c (revision 247792)
+++ machine.c (working copy)
@@ -797,7 +797,7 @@ format_next_process(caddr_t handle, char *(*get_us
double pct;
struct handle *hp;
char status[16];
- int state;
+ int cpu, state;
struct rusage ru, *rup;
long p_tot, s_tot;
char *proc_fmt, thr_buf[6], jid_buf[6];
@@ -997,6 +997,13 @@ format_next_process(caddr_t handle, char *(*get_us
}
/* format this entry */
+ if (smpmode) {
+ if (state == SRUN && pp->ki_oncpu != 0xff)
+ cpu = pp->ki_oncpu;
+ else
+ cpu = pp->ki_lastcpu;
+ } else
+ cpu = 0;
proc_fmt = smpmode ? smp_Proc_format : up_Proc_format;
if (ps.thread != 0)
thr_buf[0] = '\0';
@@ -1014,7 +1021,7 @@ format_next_process(caddr_t handle, char *(*get_us
format_k2(PROCSIZE(pp)),
format_k2(pagetok(pp->ki_rssize)),
status,
- smpmode ? pp->ki_lastcpu : 0,
+ cpu,
format_time(cputime),
ps.wcpu ? 100.0 * weighted_cpu(pct, pp) : 100.0 * pct,
screen_width > cmdlengthdelta ? screen_width - cmdlengthdelta : 0,
--
John Baldwin
More information about the freebsd-sparc64
mailing list