2010-06-10 38 views
34

我想获得总CPU使用率(%)。首先,我应该首先说“top”根本就不行,因为cpu转储之间有一段时间的延迟,它需要2次转储和几秒钟,这会挂起我的程序(我不想给它自己的线程)如何获得Linux中的总CPU使用率(C++)

接下来我试过的是“ps”,它是即时的,但总是给出非常高的数字(20+),当我真的让我的CPU做一些东西时,它停留在大约20 ...

Is there任何其他方式,我可以得到总CPU使用率?不管它是否超过一秒或更长时间......长时间段会更有用。

+0

忘了提及:延迟参数的顶部对我来说也是没用的... – Meltea 2010-06-10 18:13:15

回答

73

执行cat/proc/STAT

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

我上面这个答案达成一致。该文件中的cpu行给出了系统用于执行不同类型处理的“jiffies”的总数。

你需要做的是读取这个文件的2个读数,不管你需要什么时间间隔。这些数字是递增的值(取决于整数翻转),以便获得需要计算您的时间间隔内已经流逝了多少jiffies的%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%

希望有所帮助一点。

+0

刚完成功能,效果很好。谢谢 – Meltea 2010-06-10 19:58:00

+0

这可以很容易地通过找到特定过程的用法吗? – anon58192932 2012-05-07 17:52:31

+0

该技术类似但不完全相同。 您可以从/ proc//stat文件中获取特定于进程的数据(有关详细信息,请参阅http://www.linuxhowtos.org/manpages/5/proc.htm)。 cpu使用情况数据包含在utime和stime字段中,作为多个时钟滴答(而不是jiffies)。因此,您需要计算两次读数之间有多少时钟滴答声,通过使用sysconf查找时钟频率,通常您可以近似读取两次。 – Hitobat 2012-06-28 09:51:24

1
+0

这看起来更像是可以工作......但是每秒钟cpu的总容量是多少?我应该用CPU的时钟来计算吗?或者我怎么知道总增量,可以这么说,125,翻译成用法? – Meltea 2010-06-10 18:27:35

+0

@dav计算已用CPU时间,计算在用户/系统/任何模式下花费的时间,获取比率,例如cpu_user/cpu_ticks。 – Anycorn 2010-06-10 18:32:35

6

尝试阅读/proc/loadavg。前三个数字是实际运行的进程数量(即使用CPU),分别在最近的1,5和15分钟内进行平均。

http://www.linuxinsight.com/proc_loadavg.html

+0

这不会做...我正在寻找一个实际的百分比。我不明白我该如何计算它 – Meltea 2010-06-10 18:24:04

+0

这个答案是错误的,'/ proc/loadavg'中的数字也受到I/O的影响。 – scai 2016-08-12 11:15:42

6

/proc/cpuinfo找到可用的系统CPU /内核的数量。 调用getloadavg()(或者阅读/proc/loadavg),取第一个值,乘以100(转换为百分比),除以CPU /内核的数量。如果该值大于100,则将其截断为100.完成。

相关文章:man getloadavg和​​

注:对于* NIX系统,平均负载平均值可以超过100%(每个CPU /内核),因为它实际上测量了调度程序可以运行的进程数量。使用类似于Windows的CPU度量标准,当负载达到100%时,您并不真正知道它是对CPU资源的最佳使用还是系统过载。在* NIX下,CPU loadavg的最佳使用会使您的值达到1.0(或双系统为2.0)。如果该值比CPU /内核数量大得多,则可能需要将额外的CPU插入盒中。

否则,请挖掘/proc文件系统。

+0

有趣的是,我让电脑闲置了一分钟,最高时间为70秒。顶部显示在那一刻95%空闲。当我读取loadavg时,它显示了0.20,这是分割10%的用法,这种方法对我来说太不健康。我能负担得起的最多是1%的错误... – Meltea 2010-06-10 18:42:45

+0

我有一个系统的平均负载值非常高。拿一个用例来看看上面提出的公式是不准确的:从/ proc/loadavg中的第一个加载数据是159.47 - >乘以 - > 15900 - >除以8(核心,如在/ proc/stat中报告的)给了我一个载荷为1987.5。听起来合理,你简单地截断它到100?不是我...... :-)。这个问题更复杂。/proc/loadavg中的负载数据取决于系统上的进程数量,似乎不堪重负的系统可能非常敏感。看看'collectl'命令行工具 – 2013-11-21 13:20:18

+1

这个方法实际上是给你每个CPU的处理器队列长度。尽管这对整体系统负载来说是一个很好的衡量标准,但它并不代表实际的CPU负载。例如,如果您的CPU执行了大量'iowait',则当实际CPU使用率下降时,队列长度将会增加。 – dtoux 2015-01-20 05:27:16