我们正在研制的一些硬件,我正经历着非常奇怪的行为。我的设置包括Linux4.9.87w/ SMP &在双核iMX6 CPU上抢占RT。
在此设置上运行的应用程序由运行SCHED_FIFO调度策略的3个线程组成。优先级10、20和30被绑定到CPU0。第四个线程在CPU1上运行的调度策略相同,优先级为90。
我所经历的行为如下:
在监视进程时,top显示97.4%的时间处于空闲状态:运行在此核心上最繁忙的线程需要8.4% --这一差异为5.8%。
这是显示Solaris模式下每个CPU和每个线程的使用情况的最上面的输出:
top - 13:36:41 up 1:21, 2 users, load average: 0.52, 0.39, 0.26
Threads: 128 total, 2 running, 126 sleeping, 0 stopped, 0 zombie
%Cpu0 : 1.3 us, 1.3 sy, 0.0 ni, 97.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 509348 total, 438164 free, 46888 used, 24296 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 450196 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
798 root -91 0 37740 35656 3676 S 9.3 7.0 0:04.47 myprog
797 root -31 0 37740 35656 3676 S 8.4 7.0 0:04.43 myprog
241 root -51 0 0 0 0 R 4.7 0.0 3:55.11 irq/26-2014+
242 root rt 0 0 0 0 S 3.1 0.0 2:33.62 spi3
796 root -21 0 37740 35656 3676 S 1.9 7.0 0:01.14 myprog
794 root 20 0 2848 1892 1536 R 1.0 0.4 0:01.04 top
795 root -11 0 37740 35656 3676 S 0.3 7.0 0:00.37 myprog
3 root 20 0 0 0 0 S 0.2 0.0 0:09.14 ksoftirqd/0
10 root 20 0 0 0 0 S 0.2 0.0 0:00.14 rcuc/0
545 root -51 0 0 0 0 S 0.2 0.0 0:03.74 irq/36-can0
595 root 20 0 1700 880 824 S 0.2 0.2 0:00.99 rngd
1 root 20 0 1712 1168 1104 S 0.0 0.2 0:01.34 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
4 root -2 0 0 0 0 S 0.0 0.0 0:07.99 ktimersoftd+
5 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0
6 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H 每个线程的使用似乎是正确的,但是总数与每个CPU的使用量不匹配。
这并不是top本身的问题,因为htop表现出了同样的行为。使用/proc/stat中的值读取和计算结果也与top和htop显示的结果相同。
最高优先级线程(PID 798)每500个使用clock_nanosleep()调度一次。尝试每10个millis调度线程会显着降低CPU的总体使用率,但是这些数字仍然不匹配,并且表现出相同的行为--这表明该问题不是由当前配置的低周期时间引起的。
在股票发行内核w/o实时补丁上运行我的应用程序会产生类似的结果--同时也表明这个问题与实时补丁无关。
尝试在单核CPU上运行应用程序会再次给出类似的结果,表明问题不是由运行多核设置引起的。
提前感谢!
在内部进一步讨论这个问题后,我们怀疑这可能是一个抽样不足的问题。
如果假设内核在一定的时间间隔内获取CPU状态(用户空间、内核空间或空闲)的样本,那么如果采集更多的样本,而我的线程被调度得更少,结果就会更准确。
进一步假设样本是在计时器滴答中采集的,我将内核的CONFIG_HZ从100 to增加到1000 to,并修改了我的应用程序,以便每100‘s调度一次线程。为了达到大约50%的平均负载,一些CPU时间被浪费了,进入一个循环增加了一个计数器变量。之后,我不断地减少线程的调度间隔,同时调整延迟循环,使负载平均保持在50%左右。
我的测试得出了以下结论:当线程排定在50 My和100 My时,top报告的值似乎是正确的。
将调度间隔设置为10 of,开始显示的偏差为2-4%。进一步缩短间隔期至5ms,差异可达12%。最后,将间隔进一步减少到2ms会完全破坏顶输出,导致top显示100%的空闲时间,而应用程序则占用33%的CPU时间。
这似乎证实了我们的猜测,即这一问题是由抽样不足引起的。
有人能证实这一点吗?有谁知道CPU使用是如何由内核来衡量的吗?
发布于 2020-02-12 18:06:17
所显示的数字是估计数,大部分是通过抽样得到的。对一般的概述是有益的,对自下而上的微管理是毫无用处的.测量"CPU使用率“通常是无用的,您可以通过重载系统来达到接近100%的效果(并且几乎没有完成任何工作)。根据工作负载的性能定义总体目标,并在需要时对其进行度量和调整。
请注意,通过增加CONFIG_HZ,可以增加内核开销(但可能会得到更好的交互式响应)。对于“典型”工作负载来说,默认值是一个不错的折衷方案。如果有确凿的证据表明另一个值更适合您的用例,则更改它们。
https://unix.stackexchange.com/questions/546908
复制相似问题