如何使用 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/尝试阅读/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 getloadavg
和 man 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 使用率的主要内容,如果未能解决你的问题,请参考以下文章
使用 C++ 获取 Linux 中进程的 RAM 和 CPU 使用率
如何在 C++ 中获取 OpenGL 使用的总内存(以字节为单位)?