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

10 浏览
0 Comments

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

我正在尝试获取CPU的总使用率以百分比表示。首先,我要说的是,"top"命令是不可行的,因为在CPU转储之间存在延迟,它需要2个转储和几秒钟的时间,这会导致我的程序挂起(我不想为它单独创建一个线程)。

接下来我尝试了"ps"命令,它是瞬时的,但总是给出非常高的总数(20+),当我真正让我的CPU做一些事情时,它仍然保持在大约20的水平...

有没有其他方法可以获取总的CPU使用率?无论是在一秒钟还是更长的时间内都可以... 更长的时间段会更有用。

0
0 Comments

在Linux中使用C++获取总CPU使用率的问题是因为无法从/proc/loadavg文件中准确计算得到CPU使用率。虽然/proc/loadavg文件中包含了最近1、5和15分钟内正在运行(即正在使用CPU)的进程数量的平均值,但这并不能直接提供实际的CPU使用率百分比。此外,/proc/loadavg文件中的数据还受到I/O的影响,因此无法准确反映CPU的使用情况。

解决这个问题的方法可以是通过其他途径获取CPU使用率的信息。以下是几种常见的方法:

1. 使用/proc/stat文件:/proc/stat文件包含了系统中所有CPU的统计信息。通过解析该文件的数据,可以计算出CPU的使用率。具体的计算方法可以参考相关资料。

2. 使用系统命令:可以通过在C++程序中调用系统命令来获取CPU使用率。例如,使用top命令可以获取系统中每个进程的CPU使用率信息。通过解析top命令的输出结果,可以计算出总体的CPU使用率。

3. 使用第三方库:还可以使用一些第三方库来获取CPU使用率信息。例如,可以使用GNU Libmicrohttpd库中的函数来获取CPU使用率,并在C++程序中进行处理和显示。

需要注意的是,无论使用哪种方法获取CPU使用率,都需要进行一定的计算和解析过程,以将原始数据转换为可读的百分比形式。

总之,通过以上方法,可以在Linux系统上使用C++编程获取总CPU使用率的信息。这样就可以监控和优化系统的性能,以满足特定的需求。

0
0 Comments

使用GetTotalTimeTotal()获取总时间是因为需要计算总的活动时间和空闲时间,而不仅仅是总时间。活动时间是CPU正在执行任务的时间,而空闲时间是CPU处于空闲状态的时间。

解决方法是使用GetTotalTimeTotal()方法获取总时间,然后计算活动时间和空闲时间,最后计算CPU使用率。

修改后的代码如下:

#include "CPUSnapshot.h"
#include 
#include 
#include 
int main()
{
  CPUSnapshot previousSnap;
  std::this_thread::sleep_for(std::chrono::milliseconds(1000));
  CPUSnapshot curSnap;
  const float TOTAL_TIME  = curSnap.GetTotalTimeTotal() - previousSnap.GetTotalTimeTotal();
  const float ACTIVE_TIME = curSnap.GetActiveTimeTotal() - previousSnap.GetActiveTimeTotal();
  const float IDLE_TIME   = curSnap.GetIdleTimeTotal() - previousSnap.GetIdleTimeTotal();
  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

重新运行程序,就可以得到正确的CPU使用率。

0
0 Comments

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

在Linux中,我们可以通过读取/proc/stat文件来获取CPU的使用情况。该文件中的cpu行给出了系统在不同类型处理上花费的总jiffies数。

要获取CPU使用率,我们需要对该文件进行两次读取,两次读取之间的时间间隔可以根据需要进行设置。这些值是递增的(可能会发生整数溢出),因此我们需要计算在该时间间隔内经过了多少个jiffies,并与执行工作的jiffies数进行比较。

例如,假设在14:00:00时,文件内容如下:

cpu 4698 591 262 8953 916 449 531

总的jiffies_1 = 所有值的总和 = 16400

工作jiffies_1 = 用户时间 + nice时间 + 系统时间(前3个值的总和)= 5551

而在14:00:05时,文件内容如下:

cpu 4739 591 289 9961 936 449 541

总的jiffies_2 = 17506

工作jiffies_2 = 5619

因此,在这段时间内的CPU使用率为:

工作时间间隔 = 工作jiffies_2 - 工作jiffies_1 = 68

总时间间隔 = 总的jiffies_2 - 总的jiffies_1 = 1106

CPU使用率 = 工作时间间隔 / 总时间间隔 * 100 = 6.1%

这种方法能够轻松地找到特定进程的使用情况吗?

这种方法与上述类似,但并非完全相同。您可以从/proc//stat文件中获取特定进程的数据(有关详细信息,请参阅linuxhowtos.org/manpages/5/proc.htm)。CPU使用数据包含在utime和stime字段中,表示时钟滴答数(而不是jiffies)。因此,您需要计算出在两次读取之间可用的时钟滴答数,通常可以通过使用sysconf来近似获得时钟频率。

关于stackoverflow.com/a/9229580/582917的答案呢?它也使用了proc/stat,但不需要时间间隔。

时钟滴答和jiffies不是同一个东西,因此无法直接将/proc/pid/stat中的数据与/proc/stat中的数据进行转换。

您链接中的答案返回的是程序启动以来的总体CPU使用情况,而我们的答案返回的是当前进程的CPU使用情况。

此答案不能给出正确的答案,并且输出与top命令的输出不相似。您应该使用空闲时间(第四列)而不是前三个值,然后使用(总时间差-空闲时间差)/总时间差来计算CPU使用率。

工作jiffies是否应该累加更多的值,例如工作jiffies = 用户时间 + nice时间 + 系统时间 + IO等待时间 + 中断时间 + 软中断时间?

这就是如何在Linux中使用C++获取总CPU使用率的方法。通过读取/proc/stat文件并计算jiffies的差异,我们可以计算出CPU的使用率。对于特定进程,可以使用/proc//stat文件中的utime和stime字段来获取进程的CPU使用情况。

0