8

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

我知道并且可以/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但这导致了老鼠的巢穴。

4

3 回答 3

6

你想要的文件是/proc/stat. (您可能需要参考fs/proc/stat.cLinux 内核源代码。)

于 2010-01-24T20:14:40.360 回答
2

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

于 2010-01-23T12:54:52.313 回答
0

我猜内核文件 timer.c 在这种情况下可能对计算负载平均值很重要。从文件 timer.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);
    }
}
于 2010-01-23T18:04:41.263 回答