%CPU列和top中的负载问题

6

我的一个C++应用程序在top命令中显示非常高的%CPU使用率,但负载却很低。 我的应用程序始终占用约30%的CPU使用率,在“top”命令的顶部显示,但负载始终为0.00,因此我感到困惑,负载和%CPU列之间有什么区别?

top - 14:09:54 up 62 days,  2:52,  1 user,  load average: 0.00, 0.00, 0.00
Tasks: 124 total,   1 running, 123 sleeping,   0 stopped,   0 zombie
Cpu0  :  0.0%us,  0.0%sy,  0.0%ni, 99.7%id,  0.3%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  :  0.0%us,  0.0%sy,  0.0%ni, 99.3%id,  0.3%wa,  0.0%hi,  0.3%si,  0.0%st
Mem:   2054824k total,  1440364k used,   614460k free,     4644k buffers
Swap:  4194296k total,    16604k used,  4177692k free,   610784k cached

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                         
14774 root      20   0 1201m 9416 1856 S 28.3  0.5 376:13.50 myapp                                                                                        
14746 mysql     20   0 2012m 157m 3888 S  0.3  7.8   5:01.08 mysqld                                                                                          

有人能告诉我理解%CPU和负载之间的区别吗?

提前感谢!

1个回答

6
在例如top中显示的%CPU是瞬时的,即在那个时间正在使用的内容,而uptime显示的load则是平均值:

它通常以三个数字的形式出现,表示过去一分钟、五分钟和十五分钟内的系统负载。

随着时间的推移,这些数字应该会趋于稳定,但是当有进程等待时,尽管%CPU最大可以达到100%,但负载可能会高于1。例如:

例如,在单CPU系统上,“1.73 0.50 7.98”的平均负载可以解释为:
在过去的一分钟内,CPU超载了73%(1个CPU有1.73个可运行进程,因此有0.73个进程必须等待轮换)。
在过去的5分钟内,CPU闲置了50%(没有进程必须等待轮换)。
在过去的15分钟内,CPU超载了698%(1个CPU有7.98个可运行进程,因此有6.98个进程必须等待轮换)。
更新:
我现在才注意到,您的进程使用了28%的CPU,而“top”报告两个CPU都>99%空闲。我无法在我的Linux系统(Ubuntu 12.04,Intel i7-3770K四核HT)上重现这个问题,请参见下面的屏幕截图。
正常设置,无负载,显示所有核心的CPU使用率平均值:
top - 18:10:04 up  7:50,  2 users,  load average: 0.00, 0.05, 0.15
Tasks: 157 total,   1 running, 156 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni, 99.9%id,  0.0%wa,  0.0%hi,  0.0%si, 0.0%st
Mem:  16528224k total,  1124956k used, 15403268k free,   148772k buffers
Swap: 15624188k total,        0k used, 15624188k free, 670460k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
    7022 root      20   0     0    0    0 S    0  0.0   0:00.14 kworker/0:1        
    1 root      20   0  3640 2060 1324 S    0  0.0   0:01.23 init               
    2 root      20   0     0    0    0 S    0  0.0   0:00.00 kthreadd           
    3 root      20   0     0    0    0 S    0  0.0   0:00.14 ksoftirqd/0        
    6 root      RT   0     0    0    0 S    0  0.0   0:00.00 migration/0

一个核心的满负荷(运行yes > /dev/null),显示所有核心的CPU使用率平均值:

top - 18:11:58 up  7:52,  2 users,  load average: 0.11, 0.07, 0.15
Tasks: 157 total,   2 running, 155 sleeping,   0 stopped,   0 zombie
Cpu(s): 12.5%us,  0.0%sy,  0.0%ni, 87.5%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  16528224k total,  1124880k used, 15403344k free,   148824k buffers
Swap: 15624188k total,        0k used, 15624188k free,   670472k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND           
 8254 tim       20   0  4188  280  228 R  100  0.0   0:04.88 yes                
    1 root      20   0  3640 2060 1324 S    0  0.0   0:01.23 init               
    2 root      20   0     0    0    0 S    0  0.0   0:00.00 kthreadd           
    3 root      20   0     0    0    0 S    0  0.0   0:00.15 ksoftirqd/0        
    6 root      RT   0     0    0    0 S    0  0.0   0:00.00 migration/0        

与2相同,但显示每个核心的CPU使用情况:

top - 18:13:47 up  7:54,  2 users,  load average: 0.86, 0.36, 0.24
Tasks: 157 total,   2 running, 155 sleeping,   0 stopped,   0 zombie
Cpu0  :  0.0%us,  0.0%sy,  0.0%ni,100.0%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
Cpu2  :  0.3%us,  0.0%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu4  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu5  :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu6  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu7  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  16528224k total,  1124756k used, 15403468k free,   148840k buffers
Swap: 15624188k total,        0k used, 15624188k free,   670472k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND           
 8254 tim       20   0  4188  280  228 R  100  0.0   1:53.98 yes                
    1 root      20   0  3640 2060 1324 S    0  0.0   0:01.23 init               
    2 root      20   0     0    0    0 S    0  0.0   0:00.00 kthreadd           
    3 root      20   0     0    0    0 S    0  0.0   0:00.15 ksoftirqd/0        
    6 root      RT   0     0    0    0 S    0  0.0   0:00.00 migration/0        

注意: 我注意到第一个统计数据 top 并没有显示出 yes 的 100% CPU 使用率,与你的情况相似。也许这就是问题所在?


奇怪的是,我的应用程序在%CPU列中始终需要约30,但负载从未超过0.10。 - Yc Zhang
1
这可能是因为负载除了 CPU 之外还测量其他资源,或者系统中有多个 CPU。这应该在 manpages 中详细描述。 - Tim
你可以看到两个CPU负载都超过99%处于空闲状态。 - Yc Zhang
所有CPU都超过99%空闲,但CPU负载为28.3%,确实很奇怪。我无法在我的机器上重现这个问题,请参见上面的更新。也许其他人可以发表评论。 - Tim
注意:我注意到第一个 top 显示的统计信息并没有显示 yes 的 100% CPU 使用率,与您的情况类似。也许这就是问题所在?当 top 运行时间更长时,问题是否得到解决?(诡异的解决方案,不过也许可行) - Tim
感谢您进一步了解此事。在我的情况下,我正在虚拟机上运行64位的Red Hat Enterprise Linux 6中的myapp,该虚拟机有2个核心。myapp有15个工作线程和1个调度线程。它们都使用约2%的CPU。负载在数天内未超过0.1,并且两个核心在数天内均保持空闲超过99%。 - Yc Zhang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接