proc统计数据如何工作

时间:2015-03-30 21:56:26

标签: linux shell linux-kernel

我已经使用Linux内核对OS中的proc目录进行了大量的阅读和测试。我自己已经使用Linux多年了,但我需要了解一个小型私人项目的更多细节。具体来说,stat文件的工作方式。我知道基础知识,但不足以用它们中的数据创建实际计算。

问题是proc中的文件似乎不包含它们应该包含的内容,而不是根据我阅读的内容和我的测试内容。 例如:根状态文件中的CPU行应包含CPU的总运行时间乘以jiffies中的核心数量(和/或CPU数量)。因此,为了使系统正常运行,您必须将行中的每个数字相互添加,除以核心/ CPU的数量,然后再除以该特定系统上定义的任何jiffie。至少这是我在搜索这个主题时不断发现的公式。如果这是真的,那么结果应该等于/ proc / uptime中的第一个数字?但情况并非如此,我已经在具有不同内核数量的多台机器上测试了这一点,包括32位和64位系统。我永远无法让这两个匹配。

每个pid的stat文件也有一个正常运行时间部分(我认为它是第21部分)。但我无法弄清楚这个数字应该与什么相匹配来计算一个过程的正常运行时间。到目前为止,我已经读过,它应该包含进程启动时的总cpu jiffies。所以,如果这是真的,那么人们会简单地从当前的总cpu jiffies中减去这个并将其除以该系统上的任何jiffie?但同样,我无法接受这个以实现这一点。

然后找出一个jiffie是什么问题。我找到了一个公式,其中/ proc / stat与/ proc / uptime一起使用,有些除以内核/ CPU的数量来获得该数字。但这不起作用。当我在上面的第一个问题中提到时,我不希望这两个文件的值加起来。然而,我确实想出了一个不同的方法。只需在一秒钟内读取/ proc / stat的第一行。然后我可以比较并查看系统在该秒中添加了多少个jiffies并将其除以核心数。这适用于普通的Linux系统,但在大多数情况下它在Android上失败。 Android根据需要不断地附加/分离核心,这意味着它与你需要分配的数量不同。只要核心计数与两个读取都匹配,就没有问题,但是如果一个核心在第二次读取期间变为活动状态,则它不起作用。

最后。我没有通过除以核心量来获得该部分。如果每个核心将所有的工作时间和空闲时间写入/ proc / stat中的总线路,那么这将是有意义的,因为该线路实际上将包含核心数量的总正常运行时间。但如果这是真的那么每个cpu线将加起来相同的数字,但他们没有。这意味着除以核心数量应该提供不正确的结果。但这也意味着cpu监视工具正在计算错误,因为它们都会使用这种方法。

示例:

的/ proc / STAT

cpu  20455737 116285 4584497 104527701 1388173 366 102373 0 0 0
cpu0 4833292 5490 1413887 91023934 1264884 358 94250 0 0 0
cpu1 5785289 47944 1278053 4439797 45015 1 4235 0 0 0
cpu2 4748431 20922 926839 4552724 33455 2 2745 0 0 0
cpu3 5088724 41928 965717 4511246 44819 3 1141 0 0 0

cpu0,cpu1,cpu2和cpu3这些行的总和不会相同。这意味着使用一般cpu行的总结果除以4应该是不正确的。

的/ proc /正常运行时间

1503361.21 3706840.53

以上所有输出都来自一个应该使用100的时钟标记的系统。现在,如果你取一般cpu线的结果,除以100然后用4(核心数量),你将没有获得正常运行时间文件的结果。

如果你取得一般cpu线的结果,将其除以/ proc / uptime的正常运行时间,然后除以4(核心数量),你就不会得到这个内核时钟滴答的100。

那么为什么没有什么可以加起来呢?如何获得内核的时钟周期,即使在不断附加/分离内核的系统上也是如此?如何获得流程的总实时正常运行时间?如何从/ proc / stat获得真正的正常运行时间?

1 个答案:

答案 0 :(得分:1)

(这个答案基于4.0内核。)

每行/proc/stat上的第一个数字是每个CPU在用户模式下执行非“好”任务所花费的总时间。第二个是在用户模式下执行“好”任务所花费的总时间。

当然,CPU之间会有随机变化。例如,在一个CPU上运行的进程可能比在另一个CPU上运行的进程发出更多的系统调用或更慢的系统调用。或者一个CPU可能碰巧运行比另一个更“好”的任务。

/proc/uptime中的第一个数字是“单调启动时间” - 自系统上次启动以来经过的时间量(包括系统暂停时经过的时间)。第二个数字是所有CPU闲置的总时间。

stat下的相应子目录中的每个PID都有一个特定于任务的/proc文件。这个以PID编号,括号中的名称和状态代码(由字符表示)开始。之后的第19个数字是流程的开始时间,以刻度表示。

通过浏览Linux源代码,所有这些信息都不是很难找到。我建议您克隆Linus的repo的本地副本,并使用grep查找所需的详细信息。作为提示,/proc中的特定于流程的文件在fs/proc/base.c中实现。您询问的/proc/stat文件是在fs/proc/stat.c中实现的。 proc/uptime已在fs/proc/uptime.c中实施。

man proc也是一个很好的信息来源。