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

qni6mghb  于 2022-12-26  发布在  Linux
关注(0)|答案(7)|浏览(517)

我试图得到总的cpu使用率%。首先我应该说“top”根本不起作用,因为cpu转储之间有延迟,它需要2个转储和几秒钟,这挂起了我的程序(我不想给予它自己的线程)
下一件事,我尝试的是“ps”,这是即时的,但总是给出非常高的数字总数(20+),当我真正让我的cpu做一些事情,它停留在约20...
有没有其他方法可以得到总的cpu使用率?如果超过一秒或更长的时间段并不重要...虽然更长的时间段会更有用。

cedebl8k

cedebl8k1#

目录/过程/状态
http://www.linuxhowtos.org/System/procstat.htm
我同意上面的答案。这个文件中的cpu行给出了你的系统在做不同类型的处理时所花费的“jifies”的总数。
你需要做的是读取这个文件的两个数据,以你需要的时间间隔分开,这些数据是递增的(受整数翻转的影响),所以要得到%cpu,你需要计算在你的时间间隔内有多少jiffies已经过去了,相对于有多少jiffies花在工作上。
例如,假设在14:00:00您有
中央处理器4698 591 262 8953 916 449 531
总计_jifies_1 =(所有值的总和)= 16400
work_jifies_1 =(用户、友好、系统=前3个值的总和)= 5551
在14:00:05你有
中央处理器4739 591 289 9961 936 449 541
总计_jifies_2 = 17506
工作_备忘录_2 = 5619
因此,这段时间内的CPU使用率百分比为:
工作时间=工作量2-工作量1 = 68
一段时间内总计=总计jifies 2-总计jifies 1 = 1106
%cpu =工作超出周期/总超出周期 * 100 = 6.1%

wnavrhmk

wnavrhmk2#

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

tjvv9vkg

tjvv9vkg3#

读取/proc/cpuinfo以查找系统可用的CPU/内核数。调用getloadavg()(或者读取/proc/loadavg),取第一个值,乘以100(以转换为百分比),除以CPU/内核数。如果值大于100,则将其截断为100。完成。
相关文件:man getloadavgman 5 proc
注意:负载平均值(通常用于 *NIX系统)可超过100%(每个CPU/核心),因为它实际上测量调度程序准备运行的进程数。使用类似Windows的CPU度量,当负载为100%时,您无法真正知道这是CPU资源的最佳使用还是系统过载。在 *NIX下,CPU loadavg的最佳使用将为您提供约1.0的值(或对于双系统为2.0)。如果该值远大于CPU/内核数,则您可能需要将额外的CPU插入到机箱中。
否则,挖掘/proc文件系统。

kkbh8khc

kkbh8khc4#

cpu-stat是一个C++项目,允许从/proc/stat读取Linux CPU计数器。
从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
2j4z5cfb

2j4z5cfb6#

我建议从两个文件开始...
/处理器/状态和/处理器/CPU信息。
http://www.mjmwired.net/kernel/Documentation/filesystems/proc.txt

qco9c6ql

qco9c6ql7#

看看这个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
----------------------------------------------

相关问题