代码之家  ›  专栏  ›  技术社区  ›  David Polák

如何使用C++获取Linux中的CPU总使用率

  •  36
  • David Polák  · 技术社区  · 15 年前

    我正在尝试以百分比计算总的CPU使用率。首先,我应该说“top”根本不做,因为CPU转储之间存在延迟,它需要2个转储和几秒钟,这会挂起我的程序(我不想给它自己的线程)。

    接下来我尝试的是“ps”,它是即时的,但总是给出非常高的总数(20+),当我真正让我的CPU做一些事情时,它停留在20左右…

    有没有其他方法可以得到总的CPU使用率?不管是超过一秒钟还是更长的时间…不过,更长的周期会更有用。

    6 回复  |  直到 7 年前
        1
  •  78
  •   Hitobat    15 年前

    CAT/PROC/STAT

    http://www.linuxhowtos.org/System/procstat.htm

    我同意上面的回答。这个文件中的cpu行给出了系统花费在不同类型处理上的“jiffies”总数。

    你需要做的是从这个文件中读取2个数据,按照你需要的时间间隔分开。这些数字正在增加值(以整数滚动为准),因此要获得%cpu,您需要计算在您的时间间隔内经过了多少个jiffies,而不是花多少jiffies来完成工作。

    例如 假设你在14:00:00

    CPU 4698 591 262 8953 916 449 531

    总_jiffies_1=(所有值的总和)=16400

    work_jiffies_1=(用户总和,nice,系统=前3个值)=5551

    在14:00:05

    CPU 4739 591 289 9961 936 449 541

    总“吉非”2=17506

    工作效率2=5619

    因此,这段时间内的CPU使用率为:

    工作时间=工作时间=工作时间2-工作时间=68

    总_over_period=总_jiffies_2-总_jiffies_1=1106

    %cpu=工作\期间/总\期间*100=6.1%

    希望能有所帮助。

        2
  •  6
  •   wdebeaum    15 年前

    尝试阅读 /proc/loadavg . 前三个数字分别是过去1、5和15分钟内实际运行的进程数(即使用CPU)。

    http://www.linuxinsight.com/proc_loadavg.html

        3
  •  6
  •   Dummy00001    15 年前

    /proc/cpuinfo 查找系统可用的CPU/核心的数量。 打电话给 getloadavg() (或者读 /proc/loadavg ,取第一个值,乘以100(转换成百分比),除以CPU/核的数量。如果该值大于100,则将其截断为100。完成。

    相关文件: man getloadavg man 5 proc

    N.B.通常对NIX系统来说,平均负载可以超过100%(每个CPU/核心),因为它实际上测量了调度程序准备运行的进程数。对于类似Windows的CPU度量,当负载为100%时,您并不真正知道它是CPU资源的最佳使用还是系统过载。在*nix下,CPU loadavg的最佳使用值为1.0(对于双系统为2.0)。如果该值远大于CPU/核数,那么您可能需要将额外的CPU插入框中。

    否则,挖掘 /proc 文件系统。

        4
  •  1
  •   Anycorn    15 年前
        5
  •  0
  •   Lauro Oliveira    15 年前

    我建议两个文件开始…

    /proc/stat和/proc/cpuinfo。

    http://www.mjmwired.net/kernel/Documentation/filesystems/proc.txt

        6
  •  0
  •   souch    7 年前

    cpu-stat 是一个允许从/PROC/STAT读取Linux CPU计数器的C++项目。

    从cpu stat的src目录获取cpudata.*和cpusnaphot.*文件。

    快速实现以获得总体CPU使用率:

    #include "CPUSnapshot.h"
    
    #include <chrono>
    #include <thread>
    #include <iostream>
    
    int main()
    {
      CPUSnapshot previousSnap;
      std::this_thread::sleep_for(std::chrono::milliseconds(1000));
      CPUSnapshot curSnap;
    
      const float ACTIVE_TIME = curSnap.GetActiveTimeTotal() - previousSnap.GetActiveTimeTotal();
      const float IDLE_TIME   = curSnap.GetIdleTimeTotal() - previousSnap.GetIdleTimeTotal();
      const float TOTAL_TIME  = ACTIVE_TIME + IDLE_TIME;
      int usage = 100.f * ACTIVE_TIME / TOTAL_TIME;
      std::cout << "total cpu usage: " << usage << std::endl;
    }
    

    编译:

    g++ -std=c++11 -o CPUUsage main.cpp CPUSnapshot.cpp CPUData.cpp