我有一台 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。