如记录在https://www.kernel.org/doc/Documentation/cpu-load.txt伪文件 /proc/stat 中的信息由计时器中断更新,这意味着 /proc/stat 可能无法提供 CPU 使用情况的真实视图。
/proc/中的信息是否也是如此?PID/stat 也由定时器中断更新?如果没有,其中的信息如何/何时更新?
答案1
您需要从 Linux 内核中读取数据,因为当您读取 时,它包含值为 query 的kernel/sched/cputime.c
函数。task_cputime_adjusted
/proc/…/stat
特别是评论cputime_adjust
指出您的文档可能已过时。
根据调度程序运行时统计调整基于滴答的 cputime 随机精度
。基于 Tick 的 cputime 计费取决于任务是否被计时器中断的随机调度时间片。根据这些情况,这些中断的数量可能过于乐观或不够乐观,以可变的精度匹配真实用户和系统 cputime。
通过根据 CFS 调度程序所占的总运行时间缩放这些基于刻度的值来解决此问题。
此代码提供以下保证:
stime + utime == rtime stime_i+1 >= stime_i, utime_i+1 >= utime_i
假如说
rtime_i+1 >= rtime_i
。
因此,这里发生的情况是,kernel/sched.c
每当进程因任何原因产生时,都会更新进程所花费的时间(至少在用户空间中);但统计数据在每个系统周期更新一次(或更少)。这在多核系统中当然是不明确的,因此cputime_adjust
必须有一个自旋锁以避免多个核心尝试同时更新相同的数据。
因此,简而言之:每当进程产生对 CPU 核心的控制权时,就会完成部分更新,每个系统时钟周期都会完成部分更新,只有在一段时间后,并假设屈服时刻相对于系统时钟周期的不相关性才会执行这些值/proc/…/stat 中显示的值收敛于实际值。