代码之家  ›  专栏  ›  技术社区  ›  Stéphane

如何像“top”命令那样获取每个CPU的统计信息(系统、空闲、尼斯等)?

  •  8
  • Stéphane  · 技术社区  · 16 年前

    在Linux上,我想知道要获取每个CPU的统计信息,需要调用什么“C”API。

    我知道也能看懂 /proc/loadavg 从我的应用程序,但这是整个系统的负载可用性,而不是每个CPU的信息。我想区分各个CPU或核心。

    作为一个应用程序的例子,当我运行 top 按“1”,我可以看到4个或8个处理器/内核,如下所示:

    Cpu0  :  4.5%us,  0.0%sy,  0.0%ni, 95.5%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
    Cpu1  : 42.2%us,  6.2%sy,  0.5%ni, 51.2%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
    Cpu2  :  3.0%us,  1.5%sy,  0.0%ni, 94.5%id,  0.0%wa,  0.0%hi,  1.0%si,  0.0%st
    Cpu3  :  7.0%us,  4.7%sy,  0.0%ni, 88.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
    

    我试过 strace top 但这导致了一个老鼠窝。

    3 回复  |  直到 12 年前
        1
  •  6
  •   Matthew Slattery    16 年前

    您需要的文件是 /proc/stat . (您可能需要参考 fs/proc/stat.c 在Linux内核源代码中。)

        2
  •  2
  •   mtvec    16 年前

    这不是一个真正的答案,但我会看看top的源代码。

        3
  •  0
  •   TheHippo    12 年前

    我想在这个场景中,内核文件timer.c对于计算平均负载可能有一定的重要性。来自文件计时器.c函数calc_load()。

    unsigned long avenrun[3];
    
    static inline void calc_load(unsigned long ticks) 
    {
    
        unsigned long active_tasks; /* fixed-point */
        static int count = LOAD_FREQ;
    
        count -= ticks;
        if (count < 0) {
            count += LOAD_FREQ;
            active_tasks = count_active_tasks();
            CALC_LOAD(avenrun[0], EXP_1, active_tasks);
            CALC_LOAD(avenrun[1], EXP_5, active_tasks);
            CALC_LOAD(avenrun[2], EXP_15, active_tasks);
        }
    }