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

Dav*_*lák 37 c++ linux cpu-usage

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

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

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

Hit*_*bat 80

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

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%

希望有点帮助.


wde*_*aum 6

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

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

  • 这个答案是错误的,`/proc/loadavg`中的数字也受到I/O的影响。 (2认同)

Dum*_*001 6

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

相关文件:man getloadavgman 5 proc

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

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

  • 该方法实际上为您提供了每个 CPU 的处理器队列长度。尽管它可以很好地衡量整体系统负载,但它并不代表实际的 CPU 负载。例如,如果您的 CPU 执行大量“iowait”,则当实际 CPU 使用率下降时,队列长度将会增加。 (2认同)

sou*_*uch 5

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;
}
Run Code Online (Sandbox Code Playgroud)

编译它:

g++ -std=c++11 -o CPUUsage main.cpp CPUSnapshot.cpp CPUData.cpp
Run Code Online (Sandbox Code Playgroud)