2012-05-16 30 views
13

que tienen un proceso que parece estar en un punto muerto:utilización de la CPU alta para dormir procesa

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

Está sentado en la llamada de sistema "futex", y parece estar esperando indefinidamente en un bloqueo. El proceso se muestra que el consumo de una gran cantidad de CPU cuando "arriba" se ejecute:

# 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 

el proceso también se destaca por estar en una "S" - estado de suspensión, lo cual tiene sentido si está esperando en alguna recurso. Sin embargo, no entiendo por qué la utilización de la CPU sería cercana al 200% si el proceso está en estado inactivo. ¿Por qué la parte superior informa una utilización de CPU tan alta en un proceso de inactividad? ¿No debería su utilización de CPU ser cero?

Respuesta

5

No existe una correlación entre el uso de CPU según lo informado por top y el estado del proceso. El man page dice (énfasis mío):

% CPU - uso de la CPU

La participación de la tarea de tiempo de CPU transcurrido desde la última actualización de la pantalla, expresado como un porcentaje del total Tiempo de CPU

Por lo tanto, su proceso de hecho utilizó una gran cantidad de tiempo de procesador desde la última actualización de la pantalla. Está durmiendo, sí, pero eso se debe a que el proceso que se está ejecutando actualmente es top (lo cual tiene sentido, ya que actualmente está actualizando la pantalla).

+1

Bueno, el hecho de que 'top' se ejecute no significa que el otro proceso tenga que estar durmiendo. Más del 100% de utilización implica un sistema multinúcleo ;-). Aunque la caparazón interactiva y los subprocesos que genera pueden estar funcionando simultáneamente y * sucediendo * para causar que la otra tarea duerma, pero no es necesariamente esa directa de una causa, ¿no? – binki

4

La salida top es perfectamente normal.

Los cálculos del promedio de carga incluyen los procesos que están esperando algo (mutexes/futexes, IO, etc.) así como los procesos que realmente usan la CPU. Pruébelo, por ejemplo, ejecutando algo como:

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

y viendo la salida superior para ver qué pasa. Se aumentará la carga media por 1.

Si nos fijamos en esta línea:

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 

el "id" en "Identificación del 91,8%" significa "inactivo". Entonces, la CPU realmente no está haciendo mucho.

2

¿Su aplicación fork niño procesa? La salida de strace puede indicar que el proceso principal solo está esperando que los procesos secundarios finalicen su trabajo. Si es así, puede intentar ejecutar

strace -f -p 5075 

para rastrear los procesos secundarios también.

Cuestiones relacionadas