bash top third_line - ceragon/LinuxDoc GitHub Wiki

top third line

完整日志

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);
    }
    
    
}
⚠️ **GitHub.com Fallback** ⚠️