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

时间:2010-06-10 18:08:22

标签: c++ linux cpu-usage

我试图以%为单位获得总CPU使用率。首先我应该首先说“顶部”根本不会这样做,因为cpu转储之间存在延迟,它需要2个转储和几秒钟,这会挂起我的程序(我不想给它自己的线程)

接下来的事情我尝试的是“ps”,这是即时的,但总是给出非常高的数字(20+),当我实际上让我的cpu做一些事情时它停留在20左右......

还有其他方法可以获得总CPU使用率吗?如果它超过一秒或更长的时间段并不重要......但是更长的时期会更有用。

7 个答案:

答案 0 :(得分:78)

  

cat / proc / stat

     

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

我同意上面的答案。此文件中的cpu行给出了系统执行不同类型处理所花费的“jiffies”总数。

您需要做的是获取此文件的2个读数,按您需要的任何时间间隔分开。这些数字是增加的值(受整数翻转影响)所以要获得%cpu,你需要计算你的间隔时间内经过的jiffies数量,以及花在工作上的jiffies数量。

e.g。 假设在14:00:00你有

  

cpu 4698 591 262 8953 916 449 531

     

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

     

work_jiffies_1 =(用户总数,不错,系统=前3个值)= 5551

并且在14:00:05你有

  

cpu 4739 591 289 9961 936 449 541

     

total_jiffies_2 = 17506

     

work_jiffies_2 = 5619

因此,此期间的%cpu使用率为:

  

work_over_period = work_jiffies_2 - work_jiffies_1 = 68

     

total_over_period = total_jiffies_2 - total_jiffies_1 = 1106

     

%cpu = work_over_period / total_over_period * 100 = 6.1%

希望有所帮助。

答案 1 :(得分:6)

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

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

答案 2 :(得分:6)

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

相关文档:man getloadavgman 5 proc

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

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

答案 3 :(得分:2)

看看这个 C++ Lib

信息是从 /proc/stat 解析出来的。它还解析来自 /proc/meminfo 的内存使用和来自 /proc/net/dev 的以太网负载

----------------------------------------------
current CPULoad:5.09119
average CPULoad 10.0671
Max     CPULoad 10.0822
Min     CPULoad 1.74111
CPU: : Intel(R) Core(TM) i7-10750H CPU @ 2.60GHz
----------------------------------------------
network load: wlp0s20f3 : 1.9kBit/s : 920Bit/s : 1.0kBit/s :  RX Bytes Startup: 15.8mByte TX Bytes Startup: 833.5mByte
----------------------------------------------
memory load: 28.4% maxmemory: 16133792 Kb used: 4581564 Kb  Memload of this Process 170408 KB
----------------------------------------------

答案 4 :(得分:1)

答案 5 :(得分:0)

我建议启动两个文件......

/ proc / stat和/ proc / cpuinfo。

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

答案 6 :(得分:0)

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