gpt4 book ai didi

linux - proc stats如何运作

转载 作者:太空宇宙 更新时间:2023-11-04 10:54:32 27 4
gpt4 key购买 nike

我使用Linux内核对操作系统中的proc目录做了大量的阅读和测试。我自己已经使用Linux很多年了,但是我需要为一个小型的私人项目了解更多的细节。特别是stat文件的工作方式。我知道基本知识,但不足以用其中的数据进行实际计算。
问题是proc中的文件似乎不包含它们应该包含的内容,而不是根据我所读到的与测试的内容。
例如:根stat文件中的CPU行应该包含CPU的总正常运行时间乘以jiffies中的内核数量(和/或CPU数量)。因此,要获得系统正常运行时间,您必须将行中的每个数字相加,除以核心/CPU的数量,再除以该特定系统上定义的jiffie。至少这是我在搜索这个主题时不断发现的公式。如果这是真的,那么结果应该等于/proc/uptime中的第一个数字?但事实并非如此,我已经在多台具有不同内核数量的机器上测试过,包括32位和64位系统。我永远无法让这两个人相配。
另外,每个pid的stat文件都有一个正常运行时间部分(我认为是第21部分)。但是我不知道这个数字应该与什么匹配来计算进程的正常运行时间(以秒为单位)。到目前为止,我所读到的应该包含进程启动时的cpu jiffies总数。所以,如果这是真的,那么我们只需要从当前的总cpu jiffie中减去这个值,然后将这个值除以系统上的jiffie值?但是,我又不能把这件事归结为现实。
然后就是找出什么是圣菲的问题。我发现了一个公式,其中/proc/stat与/proc/uptime一起使用,还有一些与cores/CPU的数量相除以得到这个数字。但这不管用。当这两个文件的值没有加起来时,我也不希望这样,就像我在上面的第一个问题中提到的那样。不过,我确实想出了一个不同的方法。只需在一秒钟内读取/proc/stat的第一行两次。然后我可以比较一下,看看系统在那一秒中添加了多少个jiffie,然后将其除以核心数。这在普通的Linux系统上有效,但在大多数情况下在Android上都会失败。Android会根据需要不断地附加/分离内核,这意味着你需要划分多少内核是不同的。只要核心计数与两次读取匹配就没有问题,但是如果在第二次读取期间一个核心变为活动,它就不会工作。
最后。我不太明白用芯数除以这个部分。如果每个核心将其所有的工作时间和空闲时间写入/proc/stat中的总行,那么这一行实际上包含了总正常运行时间乘以核心数量是有意义的。但如果这是真的,那么每一个cpu行加起来都是相同的数字,但它们不是,这意味着除以内核数量会得到一个错误的结果。但这也意味着cpu监控工具会产生计算错误,因为它们都在使用这种方法。
例子:
/过程/状态

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应该是不正确的。
/进程/正常运行时间
1503361.21 3706840.53

以上所有输出都来自一个应该使用100时钟周期的系统。现在,如果取一般cpu行的结果,将其除以100,然后再除以4(内核数量),就不会得到正常运行时间文件的结果。
如果取一般cpu行的结果,除以uptime from/proc/uptime,再除以4(内核数量),就不会得到100,这就是内核时钟周期。
那为什么没有什么事情是应该的呢?如何获得内核的时钟节拍,即使在不断连接/分离内核的系统上也是如此?如何获得进程的全部实际正常运行时间?如何从/proc/stat获得真正的正常运行时间?

最佳答案

(这个答案基于4.0内核。)
/proc/stat每行的第一个数字是每个CPU在用户模式下执行非“nice”任务的总时间。第二个是在用户模式下执行“nice”任务所花费的总时间。
当然,CPU之间会有随机变化。例如,在一个CPU上运行的进程可能比在另一个CPU上运行的进程进行更多的系统调用,或者进行更慢的系统调用。或者一个CPU可能碰巧比另一个CPU运行更多的“好”任务。
/proc/uptime中的第一个数字是“单调启动时间”—自系统上次启动以来经过的时间量(包括系统挂起时经过的时间)。第二个数字是所有CPU空闲的总时间。
stat下的相应子目录中,每个PID都有一个特定于任务的/proc文件。这一个以PID号、括号中的名称和状态代码(由字符表示)开头。之后的第19个数字是进程的开始时间,单位为ticks。
仅仅通过浏览Linux源代码就不难找到所有这些信息。我建议您克隆一个本地副本的Linus'repo,并使用grep来查找您需要的详细信息。作为提示,/proc中的进程特定文件在fs/proc/base.c中实现。您询问的/proc/stat文件在fs/proc/stat.c中实现。proc/uptimefs/proc/uptime.c中实现。
man proc也是一个很好的信息来源。

关于linux - proc stats如何运作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29357067/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com