【问题标题】:Why does my measurement shows that a process consumes more CPU time than available?为什么我的测量结果显示一个进程消耗的 CPU 时间比可用时间多?
【发布时间】:2019-03-25 18:22:37
【问题描述】:

我有一个程序可以测量特定内核(这里是第二个 CPU 内核)上进程消耗的 CPU 时间。有时我会得到高于 100% 的值。

这个值的原因是什么? 访问进程的CPU时间时,总的CPU时间变化这么快吗? 我怎样才能摆脱这种不准确?

int main(int argc, char **argv)
{
    int pid = 1111;

    while (true)
    {
        long unsigned int diffCPUTotal, diffUserCPU, diffSysCPU, diffCuCPU, diffCsCPU, procCPUUsage;

        setCPUTotal();
        setProcCPU(pid);

        diffCPUTotal = cpuTotal - prev_cpuTotal;
        diffUserCPU = procUserCPU - prev_procUserCPU;
        diffSysCPU = procSysCPU - prev_procSysCPU;

        diffCuCPU = procCuCPU - prev_procCuCPU;
        diffCsCPU = procCsCPU - prev_procCsCPU;

        // Process CPU usage including child processes
        procCPUUsage = ((diffUserCPU + diffSysCPU + diffCuCPU + diffCsCPU) / (float) diffCPUTotal) * 100;

        printf("Process CPU usage: %lu%%\n", procCPUUsage);
        fflush(stdout);

        prev_cpuTotal = cpuTotal;
        prev_procUserCPU = procUserCPU;
        prev_procSysCPU = procSysCPU;

        prev_procCuCPU = procCuCPU;
        prev_procCsCPU = procCsCPU;

        usleep(500000);
    }
}

void setCPUTotal()
{
    std::ifstream fstat;
    fstat.open("/proc/stat", std::ios_base::in);

    std::string line;

    // Go to desired line
    for (int i = 0; i < 3; ++i)
        std::getline(fstat, line);

    long unsigned int user, nice, system, idle, iowait, irq, softirq, steal, guest, guest_nice;

    // Get statistics of second cpu core
    sscanf(line.c_str(), "cpu1 %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu",
                &user, &nice, &system, &idle, &iowait, &irq, &softirq, &steal, &guest, &guest_nice);


    fstat.close();

    // guest and guest_nice are already included user and nice,
    // see http://unix.stackexchange.com/q/178045/20626
    cpuTotal = user + nice + system + idle + iowait + irq + softirq + steal;
}

void setProcCPU(int pid)
{
    std::stringstream ss;
    ss << "/proc/" << pid << "/stat";
    std::string procStatPath = ss.str();

    FILE* fpstat = fopen(procStatPath.c_str(), "r");
    fscanf(fpstat, "%*d %*s %*c %*d %*d %*d %*d %*d %*u %*u %*u %*u %*u %lu"
                "%lu %ld %ld %*d %*d %*d %*d %lu %*u %*d",
                &procUserCPU, &procSysCPU, &procCuCPU, &procCsCPU, &procStartTime);

    fclose(fpstat);
}

【问题讨论】:

  • 为了重现这一点,还需要一个观察过程的例子。

标签: linux cpu-usage measurement procfs


【解决方案1】:

它以单核的形式报告。

100% 表示“一个核心”。如果你的机器有 8 个内核,那么最大可能是 800%。

如果启用了超线程,则每个超线程都算作一个核心。

【讨论】:

  • 我已禁用超线程并将具有 taskset 的进程分配给特定的 CPU 内核。它永远不应达到超过 100% 的值。我错过了什么吗?
猜你喜欢
  • 2013-12-26
  • 2011-02-05
  • 2015-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多