如何使用 C++ 获取 Linux 中的 CPU 总使用率
- 2024-11-01 08:41:00
- admin 原创
- 49
问题描述:
我正在尝试获取总 CPU 使用率(以百分比表示)。首先,我应该说“top”根本行不通,因为 CPU 转储之间有延迟,它需要 2 次转储和几秒钟的时间,这会挂起我的程序(我不想给它自己的线程)
我接下来尝试的是“ps”,虽然很即时,但总是给出非常高的总数字(20+),而当我真正让我的 CPU 做某事时,它停留在 20 左右......
还有其他方法可以获取总 CPU 使用率吗?无论是超过一秒还是更长的时间都没关系……不过,更长的时间会更有用。
解决方案 1:
猫/proc/stat
我同意上面的答案。此文件中的 cpu 行给出了系统执行不同类型的处理所花费的“jiffies”总数。
您需要做的是读取此文件两次,每次读取间隔为您需要的时间间隔。数字是递增值(受整数翻转影响),因此要获取 %cpu,您需要计算间隔内经过了多少个 jiffies,以及执行工作花费了多少个 jiffies。
例如,假设在 14:00:00 你有
中央处理器 4698 591 262 8953 916 449 531
total_jiffies_1 =(所有值的总和)= 16400
work_jiffies_1 =(用户、nice、系统的总和 = 前 3 个值)= 5551
在 14:00:05 时你有
中央处理器 4739 591 289 9961 936 449 541
总 jiffies_2 = 17506
工作时间_2 = 5619
因此这段时间内的 %cpu 使用率为:
工作周期 = 工作时长_2 - 工作时长_1 = 68
总周期数 = 总时延_2 - 总时延_1 = 1106
%CPU = 工作时间 / 总工作时间 * 100 = 6.1%
解决方案 2:
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
解决方案 3:
尝试阅读/proc/loadavg
。前三个数字分别是过去 1、5 和 15 分钟内实际运行(即使用 CPU)的进程数的平均值。
http://www.linuxinsight.com/proc_loadavg.html
解决方案 4:
阅读/proc/cpuinfo
以查找系统可用的 CPU/核心数。调用getloadavg()
(或者阅读/proc/loadavg
),取第一个值,乘以 100(转换为百分比),除以 CPU/核心数。如果值大于 100,则将其截断为 100。完成。
相关文件:man getloadavg
及man 5 proc
NB 平均负载,通常用于 NIX 系统,可能超过 100%(每个 CPU/核心),因为它实际上测量的是调度程序准备运行的进程数。使用类似 Windows 的 CPU 指标,当负载达到 100% 时,您实际上并不知道这是 CPU 资源的最佳使用还是系统过载。在 NIX 下,CPU loadavg 的最佳使用将为您提供 ~1.0 的值(对于双系统,则为 2.0)。如果该值远大于 CPU/核心数,那么您可能需要在框中插入额外的 CPU。
否则,挖掘/proc
文件系统。
解决方案 5:
猫/proc/stat
http://www.linuxhowtos.org/System/procstat.htm
解决方案 6:
我建议从两个文件开始......
/proc/stat 和 /proc/cpuinfo。
http://www.mjmwired.net/kernel/Documentation/filesystems/proc.txt
解决方案 7:
看看这个 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
----------------------------------------------
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件