使用 /proc/loadavg 计算生成的进程总数

使用 /proc/loadavg 计算生成的进程总数

在 Red Hat Linux 8 操作系统中,我检查了输出cat /proc/loadavg并获得了“5.20 5.78 8.04 16/1596 1954863”。
4 分钟后,我重新检查/proc/loadavg输出并收到“7.05 7.33 8.11 3/1605 2071966”。
现在,我正在计算两个输出的最后值之间的差,即 2071966 - 1954863 = 117103。

这是否意味着在 4 分钟的时间间隔内,系统创建了 117103 个新进程?

答案1

现在,我正在计算两个输出的最后一个值之间的差值,即 2071966 - 1954863 = 117103。这是否意味着在 4 分钟的时间间隔内,系统创建了 117103 个新进程?

不,确实如此不必要意思是说,因为pid的分配方式。 (*)
当 pid 到达内核时,/proc/sys/kernel/pid_max内核将从 300 开始搜索未分配的 pid。

因此,如果发生这样的情况,自上次重新启动以来,系统至少达到了 pid_max 一次,那么您的计算就毫无意义了。
然而,如果您可以合理地假设这是不可能的,那么,是的,您的计算确实是正确的。


在OP的评论中发现您的问题的更新,那么是的:计算不同时间报告的值的差异/proc/stat/processes绝对是获取可靠信息的方法,因为该值表示

自启动以来的分叉数

请注意这个词叉子明确提到。哪个数字实际代表的数量流程以其原始含义(和文件名),也可能是您的。
但这隐式排除了多线程进程创建的线程。 (因为它们不是由fork()系统调用生成的。并且由于线程是可调度实体,因此它的 ID(线程 ID)是从可用 PID 列表中获取的。
作为示例(采用数字只是为了简单起见,中的行按时间顺序):

    第 10 个(单线程)进程分叉:PID = 10 TID = 10
    第 11 个(多线程)进程分叉:PID = 11 TID = 11
      第一个线程由 PID11 生成:TID = 12
      第二个线程由 PID11 生成:TID = 13
    第 12 个进程分叉:PID = 14 TID = 14

然后基于计算/proc/stat/processes将报告3
当基于的微积分/proc/loadavg报告 14 - 10 = 4(+1 以考虑极端情况)=5实际上报告线程数(假设 pidmax 从未达到)。

结论:如果你真的想说流程在其原始含义中,基于的微积分/proc/stat/processes给出了您想要的结果,而不管达到任何可能的 pidmax 。
如果你的意思实际上是数量线程,那么基于的微积分/proc/loadavg就是你想要的如果您可以假设自启动以来系统从未达到 pidmax,否则,它就毫无意义。


(*) 给出的示例只是为了简单起见。自 2.5 内核以来,事情确实发生了变化(提高了效率),但主要思想仍然相同。

相关内容