Top 显示负载为 2.5:如何找出哪些进程正在等待 CPU?

Top 显示负载为 2.5:如何找出哪些进程正在等待 CPU?

我有一台 Linux 机器,上面托管着一个流量相当低的网站。这是一个 Amazon EC2“小型”实例,运行的是 Ubuntu 10.04。当我在其上运行“top”时,我通常会看到负载在 2 到 3 之间,根据我的经验,这个负载相当高。但是,机器上似乎并没有发生太多事情——CPU 几乎总是处于空闲状态,通过查看 apache2 access.log 文件,我可以看到没有太多请求通过。我如何才能找出哪些进程正在等待 CPU,以便我可以尝试了解负载指标为何如此之高?

答案1

使用 top 可以查看哪些线程正在运行,哪些线程正在休眠。如果我们谈论的是 CPU 瓶颈,这至少可以让你知道是什么在消耗你的资源。

[xxx@absynthe proc]$ top -H

应该会出现如下屏幕:

top - 17:54:38 up 37 min,  2 users,  load average: 0.03, 0.06, 0.07
Tasks: 338 total,   2 running, 336 sleeping,   0 stopped,   0 zombie
Cpu(s):  4.1%us,  2.3%sy,  0.0%ni, 92.1%id,  1.5%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   3852932k total,  1596468k used,  2256464k free,    47108k buffers
Swap:  5963768k total,        0k used,  5963768k free,   681728k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                           
 1853 root      20   0  196m  38m  15m S  9.7  1.0   1:57.58 Xorg                                                                                                                                              
 2186 xxx       -6   0  564m 8828 7216 S  3.9  0.2   0:43.69 pulseaudio                                                                                                                                        
 2611 xxx       20   0 1095m 235m  27m S  3.9  6.3   2:29.52 firefox                                                                                                                                           
 2179 xxx        9 -11  564m 8828 7216 S  1.9  0.2   0:38.34 pulseaudio                                                                                                                                        
 2671 xxx       20   0 1087m  43m  18m S  1.9  1.2   0:06.06 plugin-containe                                                                                                                                   
 2820 xxx       20   0 1275m  67m  23m S  1.9  1.8   0:13.13 souphttpsrc13:s                                                                                                                                   
 2824 xxx       20   0  315m  13m 9492 S  1.9  0.4   0:02.35 gnome-terminal                                                                                                                                    
 3114 xxx       20   0 15088 1300  820 R  1.9  0.0   0:00.02 top                                                                                                                                               
    1 root      20   0 19236 1440 1152 S  0.0  0.0   0:01.07 init                                                                                                                                              
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd                                                                                                                                          
    3 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0                                                                                                                                       
    4 root      20   0     0    0    0 S  0.0  0.0   0:00.17 ksoftirqd/0                                                                                                                                       
    5 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 watchdog/0                                                                                                                                        
    6 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/1                                                                                                                                       

名为 S 的列(即从右边数第 8 个)显示 S 表示休眠线程,R 表示正在运行的线程。您可以按 F(大写)并选择“进程状态”字段来选择排序顺序。然后,您可以按 R(大写)反转排序顺序,这样您就可以首先看到正在运行的线程。

如果您的问题不是 CPU 瓶颈,我需要更多信息来帮助您。也许您可以像我在上面的例子中所做那样发布您的 top。

希望这可以帮助。

编辑:

如果您想知道是否遇到了某种 I/O 瓶颈,可以发出以下命令:vmstat -s并查找 IO-wait CPU 滴答。如果以几秒的间隔运行该命令,该值会大幅上升,则您可能遇到了 I/O 瓶颈。在这种情况下,您最好使用 iotop 查看哪些进程正在使用更多 I/O 资源。

答案2

负载指示器不仅仅是由高 CPU 使用率引起的。进程可能由于其他原因(例如磁盘和网络 I/O)而等待。

在 Amazon EC2 小型实例上,磁盘 I/O 非常糟糕,尤其是 /dev/sda2。

您可以运行 iotop(在 debian/ubuntu 上安装 apt-get install iotop)来查看哪个进程消耗 I/O。

答案3

命令

top -i

将仅列出造成负载的进程。这应该可以帮助您找出哪些进程正在等待 CPU。

相关内容