我正在尝试获取CPU总使用率的百分比。首先,我应该说明的是“top”命令不可行,因为它在CPU快照之间存在延迟,并且需要2个快照和几秒钟的时间,这会使我的程序停顿(我不想为此单独开启线程)。
接下来我尝试使用"ps"命令,虽然延迟很小,但总使用率始终非常高(20+),而当我实际让CPU执行任务时,它保持在大约20左右...
是否有其他方法可以获取总CPU使用率?无论是一秒钟还是更长的时间都没有关系... 不过更长的时间段会更有用。
我正在尝试获取CPU总使用率的百分比。首先,我应该说明的是“top”命令不可行,因为它在CPU快照之间存在延迟,并且需要2个快照和几秒钟的时间,这会使我的程序停顿(我不想为此单独开启线程)。
接下来我尝试使用"ps"命令,虽然延迟很小,但总使用率始终非常高(20+),而当我实际让CPU执行任务时,它保持在大约20左右...
是否有其他方法可以获取总CPU使用率?无论是一秒钟还是更长的时间都没有关系... 不过更长的时间段会更有用。
cat /proc/stat
我同意上面的答案。在这个文件中,cpu行给出了您的系统在不同类型的处理过程中花费的总“节拍数”。
您需要做的是对此文件进行2次读取,时间间隔可以根据您的需求确定。这些数字是增加的值(受整数回绕限制),因此要获取%cpu,您需要计算经过的节拍数与执行工作所花费的节拍数之比。
例如。假设在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%
top
命令的不同。你应该使用“空闲时间”(第四列)而不是前三个值,然后计算:(总时间差 - 空闲时间差)/ 总时间差。 - fa7emework_jiffies
不应该累加更多的值吗,比如 work_jiffies = user + nice + system + iowait + irq + softirq
? - scaicpu-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
/proc/loadavg
。前三个数字是实际运行的进程数(即使用CPU),分别平均在过去的1、5和15分钟内。
http://www.linuxinsight.com/proc_loadavg.html
/proc/loadavg
中的数字也受到 I/O 的影响。 - scai/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)。如果该值远大于CPU /核心数,则可能需要将额外的CPU插入到盒子中。/proc
文件系统。cat /proc/stat
http://www.mjmwired.net/kernel/Documentation/filesystems/proc.txt
看一下这个 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
----------------------------------------------