答案1
我已经发现发生了什么事。 Linux 内核文档(https://www.kernel.org/doc/html/latest/admin-guide/cpu-load.html/proc/stat
)解释了(top
/htop
使用该数据)中显示的数据是如何收集的:
每当定时器中断发出信号时,内核都会查看此时正在运行的任务类型,并递增与该任务类型/状态相对应的计数器。这样做的问题是,系统可能在两个定时器中断之间多次在各种状态之间切换,但计数器仅针对最后一个状态递增。
正如我之前所说,在我的情况下,大多数数据处理会在短突发中定期(每 10 毫秒)发生(2..4 毫秒足以完成数据块处理)。该行为与示例相符(https://www.kernel.org/doc/html/latest/admin-guide/cpu-load.html#example) - 所有处理都是在系统状态采样之间进行的,因此系统认为它一直处于空闲状态:
system state sampled in timer interrupt (10ms period on my system)
| |
v 10ms v
...--|----------------------------------------|-------------------------...
^ 3ms ^ 7ms ^ 3ms ^
sleep | active | sleep | active | sleep
...------> | <------> | <-------------------------> | <------> | <------...
/proc/[pid]/stat
我通过使用计数器来计算处理数据处理的进程的 CPU 利用率(列top
中显示的相同信息)解决了这个问题%CPU
,因为其他进程也使用 CPU,但在我的情况下,它们的 CPU 利用率可以忽略不计。