bash top third_line - ceragon/LinuxDoc GitHub Wiki
top - 10:49:30 up 4 days, 13:08, 1 user, load average: 0.10, 0.28, 0.20
任务: 306 total, 1 running, 304 sleeping, 0 stopped, 1 zombie
%Cpu(s): 3.5 us, 1.4 sy, 0.0 ni, 95.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 15897.9 total, 235.3 free, 8007.0 used, 7655.7 buff/cache
MiB Swap: 2048.0 total, 1687.5 free, 360.5 used. 7403.8 avail Mem
进程号 USER PR NI VIRT RES SHR %CPU %MEM TIME+ COMMAND
446465 ceragon 20 0 11.7g 5.1g 535188 S 25.0 33.0 38:23.92 ld-linux-x86-64
517659 ceragon 20 0 15112 3984 3204 R 12.5 0.0 0:00.02 top
452 root -51 0 0 0 0 S 6.2 0.0 0:52.38 irq/168-iwlwifi
328018 ceragon 20 0 11.7g 2.4g 465028 S 6.2 15.2 69:05.34 ld-linux-x86-64
1 root 20 0 169256 11512 6604 S 0.0 0.1 0:09.36 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.09 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
这一栏其实显示的是各项使用 CPU 的占比,一共 8 项,求和之后是 100
%Cpu(s): 3.5 us, 1.4 sy, 0.0 ni, 95.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
const char *Norm_nlstab[norm_MAX];
static void build_norm_nlstab (void) {
Norm_nlstab[WORD_allcpus_txt] = _("Cpu(s):");
}
extern long smp_num_cpus; /* number of CPUs */
static CPU_t *Cpu_tics;
static void summary_show (void) {
// 打印 CPU 的总和使用率
summary_hlp(&Cpu_tics[smp_num_cpus], N_txt(WORD_allcpus_txt));
Msg_row += 1;
}
static const char *Cpu_States_fmts;
static void summary_hlp (CPU_t *cpu, const char *pfx) {
SIC_t u_frme, s_frme, n_frme, i_frme, w_frme, x_frme, y_frme, z_frme, tot_frme, tz;
float scale;
// 所有的 frme 都是增量
u_frme = TRIMz(cpu->cur.u - cpu->sav.u); // user
s_frme = TRIMz(cpu->cur.s - cpu->sav.s); // system
n_frme = TRIMz(cpu->cur.n - cpu->sav.n); // nice
i_frme = TRIMz(cpu->cur.i - cpu->sav.i); // idle
w_frme = TRIMz(cpu->cur.w - cpu->sav.w); // io wait time
x_frme = TRIMz(cpu->cur.x - cpu->sav.x); // hardware irq time
y_frme = TRIMz(cpu->cur.y - cpu->sav.y); // software irq time
z_frme = TRIMz(cpu->cur.z - cpu->sav.z); // virtual steal time
tot_frme = u_frme + s_frme + n_frme + i_frme + w_frme + x_frme + y_frme + z_frme;
if (1 > tot_frme) i_frme = tot_frme = 1;
scale = 100.0 / (float)tot_frme;
show_special(0, fmtmk(Cpu_States_fmts, pfx
, (float)u_frme * scale, (float)s_frme * scale
, (float)n_frme * scale, (float)i_frme * scale
, (float)w_frme * scale, (float)x_frme * scale
, (float)y_frme * scale, (float)z_frme * scale));
}
int main (int dont_care_argc, char **argv) {
for (;;) {
frame_make();
}
}
static void frame_make (void) {
if (Pseudo_row == PROC_XTRA) {
cpus_refresh();
}
}
$ sudo cat /proc/stat
cpu 442287 91 66900 27212926 23591 0 4011 0 0 0
cpu0 54037 11 8848 3403007 2392 0 113 0 0 0
cpu1 57444 11 7889 3401259 2226 0 138 0 0 0
cpu2 55961 9 8170 3401534 3462 0 93 0 0 0
cpu3 56586 9 8085 3401261 2846 0 86 0 0 0
cpu4 55717 11 8108 3402376 3123 0 85 0 0 0
cpu5 52001 14 8968 3401020 2532 0 2893 0 0 0
cpu6 54521 10 8344 3402200 3652 0 218 0 0 0
cpu7 56018 13 8484 3400266 3353 0 382 0 0 0
intr 17909866 0 1696 0 0 0 0 0 0 0 40637 0 0 677 0 0 0 11975 0
ctxt 57060980
btime 1651635156
processes 55289
procs_running 2
procs_blocked 1
softirq 10718346 20979 1225792 485 986490 41456 0 116373 5158926 3 3167842
static void cpus_refresh (void) {
static FILE *fp = NULL;
static int siz, sav_slot = -1;
static char *buf;
CPU_t *sum_ptr;
int i, num, tot_read;
char *bp;
// 打开文件流
fp = fopen("/proc/stat", "r");
tot_read = 0;
// 给 buf 分配空间
buf[0] = alloc_c((siz = buffGRW));
// 下面的 while 循环主要是把 stat 的输出信息赋值到 buf 中
while (0 < (num = fread(buf + tot_read, 1, (siz - tot_read), fp))) {
tot_read += num;
if (tot_read < siz) break;
buf = alloc_r(buf, (siz += buffGRW));
};
// 赋值给 bp
bp = buf;
// ----------- cpu 的总体情况
sum_ptr = &Cpu_tics[sumSLOT];
// 保存上一次的值到 sav 中
memcpy(&sum_ptr->sav, &sum_ptr->cur, sizeof(CT_t));
// 赋值新的结果
sscanf(bp, "cpu %llu %llu %llu %llu %llu %llu %llu %llu"
, &sum_ptr->cur.u, &sum_ptr->cur.n, &sum_ptr->cur.s
, &sum_ptr->cur.i, &sum_ptr->cur.w, &sum_ptr->cur.x
, &sum_ptr->cur.y, &sum_ptr->cur.z);
// sumSLOT 有几个逻辑核心,数量就是几
for (i = 0; i < sumSLOT; i++) {
// 为每一个逻辑 CPU 赋值
CPU_t *cpu_ptr = &Cpu_tics[i];
// 使用 sav 保存上一次的值
memcpy(&cpu_ptr->sav, &cpu_ptr->cur, sizeof(CT_t));
// 赋值新的结果
sscanf(bp, "cpu%d %llu %llu %llu %llu %llu %llu %llu %llu", &cpu_ptr->id
, &cpu_ptr->cur.u, &cpu_ptr->cur.n, &cpu_ptr->cur.s
, &cpu_ptr->cur.i, &cpu_ptr->cur.w, &cpu_ptr->cur.x
, &cpu_ptr->cur.y, &cpu_ptr->cur.z);
}
}