睡眠过程的CPU利用率很高

bli*_*ile 14 linux cpu deadlock sleep process

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

# strace -p 5075
Process 5075 attached - interrupt to quit
futex(0x419cf9d0, FUTEX_WAIT, 5095, NULL
Run Code Online (Sandbox Code Playgroud)

它坐在"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
Run Code Online (Sandbox Code Playgroud)

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

Fré*_*idi 7

报告的CPU使用率top与进程状态之间没有相关性.该手册页说(重点煤矿):

%CPU - CPU使用率

任务在上次屏幕更新后经过的CPU时间的份额,表示为总CPU时间的百分比.

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

  • 好吧,`top` 正在运行的事实并不意味着其他进程必须处于睡眠状态。超过 100% 的利用率意味着多核系统;-)。虽然它产生的交互式 shell 和子进程可能同时运行并*发生*导致另一个任务进入睡眠状态,但这不一定是直接的原因,对吧? (3认同)