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

Posted

技术标签:

【中文标题】如何使用 C++ 在 Linux 中获取总 CPU 使用率【英文标题】:How to get total cpu usage in Linux using C++ 【发布时间】:2011-03-02 07:45:34 【问题描述】:

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

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

有没有其他方法可以获得总 CPU 使用率?超过一秒或更长的时间都没有关系……不过,更长的时间会更有用。

【问题讨论】:

忘了说:top 的 delay 参数对我也没用... 【参考方案1】:

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 = (user,nice,system = 前 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%

希望能有所帮助。

【讨论】:

这个可以很方便的找到具体流程的使用情况吗? 技术相似但不完全相同。您可以从 /proc//stat 文件中获取特定于进程的数据(有关详细信息,请参阅linuxhowtos.org/manpages/5/proc.htm)。 Cpu 使用数据包含在 utime 和 stime 字段中,作为时钟滴答数(而不是 jiffies)。因此,您需要计算出 2 个读数之间可用的时钟节拍数,通常可以通过使用 sysconf 查找时钟频率来估算。 这个答案怎么样:***.com/a/9229580/582917 它也使用 proc/stat,但不需要间隔。 @Hitobat 不是 jiffy 和时钟滴答声是一样的,所以 /proc/pid/stat 中的数据处理方式与 /proc/stat 中的相同吗?如果不是,我们如何将时钟滴答转换为 jiffy 或反之亦然? @CMCDragonkai 链接中的答案返回自启动程序以来的总体 CPU 使用率。 答案返回进程的当前 CPU 使用率。【参考方案2】:

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

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

【讨论】:

那不行...我正在寻找一个实际百分比。我看不出我怎么能从中计算出来 这个答案是错误的,/proc/loadavg中的数字也受I/O影响。【参考方案3】:

阅读/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)。如果该值远大于 number CPU/cores,那么您可能需要在框中插入额外的 CPU。

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

【讨论】:

有趣,我刚刚让计算机空闲一分钟,顶部延迟 70 秒。 Top 在那一分钟内显示 95% 的空闲。当我阅读 loadavg 时,它显示了 0.20,即使用量的 10%,这种方法对我来说太不精确了。我能承受的最多是 1% 的错误...... 我有一个平均负载值非常高的系统。举一个用例,看看上面建议的公式是不准确的:来自 /proc/loadavg 的第一个负载数字是 159.47 -> 相乘 -> 15900 -> 除以 8(核心,如 /proc/stat 中报告的)给我一个负载为 1987.5 。简单地将其截断为 100 听起来合理吗?不是我... :-) 。这个问题比较复杂。 /proc/loadavg 中的负载数字取决于系统上的进程数,看似不堪重负的系统可能会非常敏感。看看 'collectl' 命令行工具 此方法实际上是为您提供每个 CPU 的处理器队列长度。尽管它是衡量整个系统负载的好方法,但它并不代表实际的 CPU 负载。例如,如果您的 CPU 执行大量iowait,则当实际 CPU 使用率下降时,队列长度会增加。【参考方案4】:

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

【讨论】:

嗨,我在我的程序中尝试了这部分,它给出了 66。你能解释一下这是什么意思吗?我的程序需要 2 秒才能完成它的执行,然后它给出了 66,我不明白这是什么意思。所以请帮帮我。 这意味着您的 CPU 使用率在一秒钟内为 66%。【参考方案5】:

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

【讨论】:

【参考方案6】:

cat /proc/stat

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

【讨论】:

这看起来更像是它可以工作......但是每秒钟cpu的总容量是多少?我应该用cpu的时钟计算吗?或者我怎么知道总增量(比如说 125)转化为使用量? @dav 计算经过的 cpu 时间,计算在 user/system/whatever 模式下花费的时间,获取 ratio ,例如 cpu_user/cpu_ticks。【参考方案7】:

我建议两个文件开始...

/proc/stat 和 /proc/cpuinfo。

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

【讨论】:

以上是关于如何使用 C++ 在 Linux 中获取总 CPU 使用率的主要内容,如果未能解决你的问题,请参考以下文章

linux常用查看硬件配置命令

使用 C++ 获取 Linux 中进程的 RAM 和 CPU 使用率

如何在 C++ 中获取 OpenGL 使用的总内存(以字节为单位)?

如何分析 Windows 和 Linux 上的应用程序以获取 CPU 和 RAM 使用值? [关闭]

如何获取 Posix 系统中的总可用磁盘空间?

如何使用C或C++编程获取电脑CPU使用率?如何使用C或C++获取指定进程的CPU使用率?