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

2024-11-01 08:41:00
admin
原创
49
摘要:问题描述:我正在尝试获取总 CPU 使用率(以百分比表示)。首先,我应该说“top”根本行不通,因为 CPU 转储之间有延迟,它需要 2 次转储和几秒钟的时间,这会挂起我的程序(我不想给它自己的线程)我接下来尝试的是“ps”,虽然很即时,但总是给出非常高的总数字(20+),而当我真正让我的 CPU 做某事时,...

问题描述:

我正在尝试获取总 CPU 使用率(以百分比表示)。首先,我应该说“top”根本行不通,因为 CPU 转储之间有延迟,它需要 2 次转储和几秒钟的时间,这会挂起我的程序(我不想给它自己的线程)

我接下来尝试的是“ps”,虽然很即时,但总是给出非常高的总数字(20+),而当我真正让我的 CPU 做某事时,它停留在 20 左右......

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


解决方案 1:

猫/proc/stat

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

我同意上面的答案。此文件中的 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 getloadavgman 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
----------------------------------------------
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用