进程 CPU 总和高于 top/htop 中显示的总 CPU 消耗

进程 CPU 总和高于 top/htop 中显示的总 CPU 消耗

为什么两者top/htop/proc/stat报告 CPU 利用率如此低?进程 CPU 利用率数字(屏幕截图中的 67.5%)似乎是正确的。 在此输入图像描述

有时我会看到预期的结果,例如: 在此输入图像描述

一些细节: Linux(内核版本 4.19.0)在 Zynq 7z010(双核 ARM Cortex-A9 处理器)上运行。信号处理应用程序(server.elf在屏幕截图上)消耗了大部分资源。大部分处理发生在两个线程中:一个 ( Receiver_0) 每 10 毫秒唤醒一次,另一个 ( Spectrum_0) - 每 17 毫秒唤醒一次。这些线程是使用 SCHED_FIFO 调度程序进行调度的。

答案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 利用率可以忽略不计。

相关内容