睡眠过程的CPU利用率很高

时间:2012-05-16 23:19:40

标签: linux process cpu deadlock sleep

我有一个似乎陷入僵局的过程:

# strace -p 5075
Process 5075 attached - interrupt to quit
futex(0x419cf9d0, FUTEX_WAIT, 5095, NULL

它坐在“futex”系统调用上,似乎无限期地等待锁定。当运行“top”时,该过程显示消耗大量CPU:

# top -b -n 1
top - 23:13:18 up 113 days,  4:19,  1 user,  load average: 1.69, 1.74, 1.72
Tasks: 269 total,   1 running, 268 sleeping,   0 stopped,   0 zombie
Cpu(s):  8.1%us,  0.1%sy,  0.0%ni, 91.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  12165696k total,  3810476k used,  8355220k free,    29440k buffers
Swap:  8388600k total,    43312k used,  8345288k free,   879988k cached

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
5075 omdb      18   0 2373m 1.7g  26m S 199.7 14.9 102804:11 java

该过程也显示处于“S” - 睡眠状态,如果它正在等待一些资源,这是有意义的。但是,我不明白为什么如果进程处于睡眠状态,CPU利用率将接近200%。为什么top会在睡眠过程中报告如此高的CPU利用率?它的CPU利用率不应该为零吗?

4 个答案:

答案 0 :(得分:6)

top报告的CPU使用率与进程状态之间没有相关性。 man page说(强调我的):

  

%CPU - CPU使用率

     

自上次屏幕更新以来任务占用的CPU时间的份额,表示为占总CPU时间的百分比。

因此,自上次屏幕更新以来,您的进程确实使用了大量的处理器时间。它正在睡觉,是的,但那是因为当前正在运行的进程本身是top(这是有意义的,因为它当前正在更新屏幕)。

答案 1 :(得分:4)

top输出完全正常。

负载平均计算包括正在等待某些内容的进程(互斥锁/互斥锁,IO等)以及实际使用CPU的进程。比如运行类似的测试:

dd if=/dev/sda of=/dev/null

并观察最高输出以查看会发生什么。它会将平均负载增加1。

如果你看这一行:

Cpu(s):  8.1%us,  0.1%sy,  0.0%ni, 91.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

“91.8%id”中的“id”表示“空闲”。所以CPU实际上并没有做太多的事情。

答案 2 :(得分:3)

您的应用程序是否会分叉子进程? strace输出可以指示主进程正在等待子进程完成其工作。如果是这样,您可以尝试运行

strace -f -p 5075

也可以跟踪子进程。

答案 3 :(得分:0)

让我加两分钱。

顶部显示了特定时间进程的状态。但这并不意味着该进程是以前所有时间都处于这种状态。

这种建议是完全错误的。

该过程可以在R和S状态之间切换一百万次(在先前的最高时间和当前最高力矩之间),因此,如果该过程在R和S状态之间快速切换 您可以轻松地将其捕获为S状态。

但是,它在交换机之间使用cpu时间。

因此,请感受一下cpu_usage事物(描述一个时间段)和状态事物(描述一个特定的时刻)之间的区别。

让我举一个清晰的例子。

在过去的10分钟内,有人从您的口袋里偷走了3个苹果。

但是,现在它并没有从口袋里偷走苹果。

被盗的苹果= cpu_usage, 这个人现在不偷苹果的事实=进程状态

然后,获得一个特征并尝试预测另一个特征是完全错误的。