C++ 如何使用C++;

C++ 如何使用C++;,c++,linux,cpu-usage,C++,Linux,Cpu Usage,我正在尝试以%为单位获取总cpu使用率。首先,我应该说“top”根本不行,因为cpu转储之间有延迟,它需要2次转储和几秒钟,这会挂起我的程序(我不想给它自己的线程) 接下来我尝试的是“ps”,它是即时的,但总是给出非常高的总数(20+),当我真正让我的cpu做某事时,它保持在20左右 有没有其他方法可以获得cpu的总使用率?不管是超过一秒还是更长的时间。。。不过,更长的周期会更有用。cat/proc/stat 尝试阅读/proc/loadavg。前三个数字是实际运行(即使用CPU)的进程数,分别

我正在尝试以%为单位获取总cpu使用率。首先,我应该说“top”根本不行,因为cpu转储之间有延迟,它需要2次转储和几秒钟,这会挂起我的程序(我不想给它自己的线程)

接下来我尝试的是“ps”,它是即时的,但总是给出非常高的总数(20+),当我真正让我的cpu做某事时,它保持在20左右

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

cat/proc/stat


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


我建议启动两个文件

/proc/stat和/proc/cpuinfo


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

相关文档:
man getloadavg
man 5程序

注意:对于*NIX系统来说,平均负载可能超过100%(每个CPU/核心),因为它实际上测量了调度程序准备运行的进程数。对于类似Windows的CPU指标,当负载为100%时,您不知道这是CPU资源的最佳使用还是系统过载。在*NIX下,CPU loadavg的最佳使用将为您提供~1.0的值(对于双系统,为2.0)。如果该值远大于CPU/核心数,则可能需要将额外的CPU插入该框中

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

cat/proc/stat

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

您需要做的是读取该文件的2个读数,按所需的时间间隔分开。这些数字是递增的值(以整数滚动为准),因此要获得%的cpu,您需要计算在您的时间间隔内经过的jiffie数量,以及花在工作上的jiffie数量

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

cpu 4698 591 262 8953 916 449 531

总计(所有值之和)=16400

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

在14:00:05你有

中央处理器4739591289961936449541

总费用2=17506

工作时间2=5619

因此,这段时间的cpu使用率百分比为:

工作周期=工作时间2-工作时间1=68

期间内的总费用=总费用2-总费用1=1106

%cpu=工作周期/总工作周期*100=6.1%

希望有帮助。

< P>是一个允许从/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;
}

看看这个C++。< /P> 该信息从/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
----------------------------------------------

忘了提一下:拖延争论对我来说也是无用的…那不行。。。我在找一个实际的百分比。我不知道如何计算出这个答案是错误的,
/proc/loadavg
中的数字也受I/O的影响。这看起来更像是可行的。。。但是每秒钟cpu的总容量是多少?我应该用cpu的时钟计算吗?或者,我如何知道125的总增量转化为使用率?@dav计算已用cpu时间,在用户/系统/任何模式下花费的计算时间,获取比率,例如cpu_用户/cpu_滴答声。有趣的是,我刚刚让计算机空闲一分钟,最高延迟为70秒。Top在那一分钟显示了95%的空闲。当我阅读loadavg时,它显示了0.20,也就是10%的使用率,这个方法对我来说太不精确了。我能承受的最大误差是1%…我有一个平均负载值非常高的系统。以一个用例为例,看看上面建议的公式有多不准确:来自/proc/loadavg的第一个负载数字是159.47->乘以->15900->除以8(core,如/proc/stat中所报告的),给了我1987.5的负载。简单地将其截断为100听起来合理吗?对我来说不是…:-)。这个问题更复杂。/proc/loadavg中的负载数字取决于系统上进程的数量,而且似乎有些超负荷的系统可能响应速度非常快。查看“collectl”命令行工具此方法实际上为您提供了每个CPU的处理器队列长度。尽管这是一个很好的衡量总体系统负载的指标,但它并不代表实际的CPU负载。例如,如果您的CPU执行了大量的
iowait
,当实际CPU使用率下降时,队列长度将上升。这可以很容易地用于查找特定进程的使用情况吗?该技术类似,但并不完全相同。您可以从/proc//stat文件中获取特定于流程的数据(有关详细信息,请参阅)。Cpu使用率数据包含在utime和stime字段中,以时钟滴答数(而不是jiffies)表示。因此,您需要计算出两次读数之间有多少时钟滴答声,通常可以通过使用sysconf查找时钟频率来近似计算。这个答案如何:它也使用proc/stat,但不需要间隔。@Hitobat和时钟滴答声不是一回事,因此,在/proc/pid/stat中以与在/proc/stat中相同的方式处理数据应该可以吗?如果不是,我们如何转换时钟ti
----------------------------------------------
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
----------------------------------------------