首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Top中CPU使用不一致

Top中CPU使用不一致
EN

Unix & Linux用户
提问于 2019-10-15 15:58:15
回答 1查看 631关注 0票数 0

我们正在研制的一些硬件,我正经历着非常奇怪的行为。我的设置包括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和每个线程的使用情况的最上面的输出:

代码语言:javascript
复制
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使用的总和与总数不匹配吗?
  • 如何获得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使用是如何由内核来衡量的吗?

EN

回答 1

Unix & Linux用户

发布于 2020-02-12 18:06:17

所显示的数字是估计数,大部分是通过抽样得到的。对一般的概述是有益的,对自下而上的微管理是毫无用处的.测量"CPU使用率“通常是无用的,您可以通过重载系统来达到接近100%的效果(并且几乎没有完成任何工作)。根据工作负载的性能定义总体目标,并在需要时对其进行度量和调整。

请注意,通过增加CONFIG_HZ,可以增加内核开销(但可能会得到更好的交互式响应)。对于“典型”工作负载来说,默认值是一个不错的折衷方案。如果有确凿的证据表明另一个值更适合您的用例,则更改它们。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/546908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档