Proceso atascado: ¿es una mala señal?

23

A veces, algunos procesos están en un estado atascado. Por ejemplo:

PID    COMMAND          %CPU TIME     #TH  #WQ  #POR #MREGS RPRVT  RSHRD  RSIZE  VPRVT  VSIZE  PGRP  PPID  STATE
99357  plugin-container 0.1  12:07.07 10   1    224  2097   40M    84M    66M    82M    2757M  91688 99346 sleeping
99346  firefox          0.4  48:54.20 29   1    265  16250  467M   172M   799M   538M   4210M  91688 1     sleeping 
88029- Aquamacs       1.2  31:24.12 4    3    126  268    19M    49M    32M    36M    777M   88029 152   stuck

¿Es parte del ciclo de vida normal del proceso? ¿Por qué este proceso en particular?

Qué significa exactamente ?

alecail
fuente

Respuestas:

38

No es necesariamente una mala señal, pero déjame responder tu última pregunta primero:

¿Qué significa exactamente?

En el topcódigo fuente (de http://www.opensource.apple.com/release/mac-os-x-1082/ ) el estado atascado se denomina identificador LIBTOP_STATE_STUCK(de libtop.c):

libtop_state_str(uint32_t state)
{
        const char *strings[] = {
                "zombie",
#define LIBTOP_STATE_ZOMBIE     0
                "running",
#define LIBTOP_STATE_RUN        1
                "stuck",
#define LIBTOP_STATE_STUCK      2
                "sleeping",
#define LIBTOP_STATE_SLEEP      3
                "idle",
#define LIBTOP_STATE_IDLE       4
                "stopped",
#define LIBTOP_STATE_STOP       5
                "halted",
#define LIBTOP_STATE_HALT       6
                "unknown"
#define LIBTOP_STATE_UNKNOWN    7
        };
(...)
}

Más adelante en el mismo archivo, LIBTOP_STATE_STUCKse asigna al estado del núcleo TH_STATE_UNINTERRUPTIBLE:

/* Translate a mach state to a state in the state breakdown array. */
static int
libtop_p_mach_state_order(int state, long sleeptime)
{
        switch (state) {
                case TH_STATE_RUNNING:
                        return LIBTOP_STATE_RUN;
                case TH_STATE_UNINTERRUPTIBLE:
                        return LIBTOP_STATE_STUCK;
(...)
}

Entonces, un proceso en estado atascado significa que el proceso / hilo está en un estado de espera ininterrumpible , que es cómo TH_STATE_UNINTERRUPTIBLEse define en la estructura del kernel thread_basic_info(ver http://web.mit.edu/darwin/src/modules/xnu/osfmk/ man / thread_basic_info.html ):

struct thread_basic_info
{
(...)
       integer_t        run_state;
(...)
};

donde run_statees:

run_state: el estado de ejecución del hilo. Los valores posibles son:

(...)

  • TH_STATE_UNINTERRUPTIBLE: el hilo está en un estado de espera ininterrumpible.

(...)

Esto generalmente es causado por un proceso en espera de E / S, es decir, el proceso ha solicitado leer o escribir en / desde el disco o la red y espera a que vuelva la llamada del sistema (consulte http://en.wikipedia.org / wiki / Sleep_% 28operating_system% 29 # Uninterruptible_sleep o http://www.novell.com/support/kb/doc.php?id=7002725 para obtener más información).

(Cuando no se utilizan las opciones de BSD, como suele ser el caso en Linux, psmuestra la suspensión ininterrumpida como estado D ).

¿Es parte del ciclo de vida normal del proceso?

Sí lo es. Lo que no es normal es que un proceso permanezca en este estado durante mucho tiempo. Esa es una mala señal.

¿Por qué este proceso en particular?

Dificil de decir. Por lo general, se debe a cuellos de botella de E / S con actividad intensa en el disco o conectividad degradada cuando se utilizan sistemas de archivos de red (el escenario más habitual, en mi experiencia).

(Esta es una pregunta relacionada en Ask Different: /apple/58697/how-does-stuck-in-results-of-top-relate-to-not-responding-in-activity- m .)

jaume
fuente
1
¿Cómo puedo saber qué procesos están estancados exactamente?
mareoraft
3
@mareoraft En OS X, los que tienen un código de estado 'U' en la salida de ps axugo ps -eo user,pid,stat,args. En Linux, los que tienen un código de estado 'D' con los mismos pscomandos. Consulte la explicación de la palabra clave de estado (OS X) o la sección CÓDIGOS DE ESTADO DEL PROCESO (Linux) man pspara obtener más información. O, en OS X, puede ejecutar topy buscar procesos marcados como stucken la columna ESTADO.
jaume