Processus bloqué: est-ce un mauvais signe?

23

Parfois, quelques processus sont bloqués. Par exemple:

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

Cela fait-il partie du cycle de vie normal du processus? Pourquoi ce processus en particulier?

Qu'est-ce que cela signifie exactement?

alecail
la source

Réponses:

38

Ce n'est pas nécessairement un mauvais signe, mais permettez-moi de répondre d'abord à votre dernière question:

Qu'est-ce que cela signifie exactement?

Dans le topcode source (à partir de http://www.opensource.apple.com/release/mac-os-x-1082/ ), l' état bloqué est appelé identifiant 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
        };
(...)
}

Plus loin dans le même fichier, LIBTOP_STATE_STUCKest mappé à l'état du noyau 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;
(...)
}

Ainsi, un processus à l' état bloqué signifie que le processus / thread est dans un état d'attente sans interruption , ce qui TH_STATE_UNINTERRUPTIBLEest défini dans la structure du noyau thread_basic_info(voir http://web.mit.edu/darwin/src/modules/xnu/osfmk/ man / thread_basic_info.html ):

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

run_stateest:

run_state: l'état d'exécution du thread. Les valeurs possibles sont:

(...)

  • TH_STATE_UNINTERRUPTIBLE: le thread est dans un état d'attente non interruptible.

(...)

Cela est généralement dû à un processus en attente d'E / S, c'est-à-dire que le processus a demandé à lire ou à écrire sur / depuis le disque ou le réseau et attend le retour de l'appel système (voir http://en.wikipedia.org / wiki / Sleep_% 28operating_system% 29 # Uninterruptible_sleep ou http://www.novell.com/support/kb/doc.php?id=7002725 pour plus d'informations).

(Lorsque vous n'utilisez pas les options BSD, comme c'est généralement le cas sous Linux, le pssommeil ininterrompu apparaît comme l' état D. )

Cela fait-il partie du cycle de vie normal du processus?

Oui, ça l'est. Ce qui n'est pas normal, c'est qu'un processus reste dans cet état pendant longtemps. C'est mauvais signe.

Pourquoi ce processus en particulier?

Dur à dire. Il est généralement provoqué par des goulots d'étranglement d'E / S avec une activité importante du disque ou une connectivité dégradée lors de l'utilisation de systèmes de fichiers réseau (le scénario le plus courant, selon mon expérience).

(Il s'agit d'une question connexe dans Ask Different: /apple/58697/how-does-stuck-in-results-of-top-relate-to-not-responding-in-activity- m .)

jaume
la source
1
Comment savoir quels processus sont bloqués exactement?
mareoraft
3
@mareoraft Sous OS X, ceux avec un code d'état «U» dans la sortie de ps axugou ps -eo user,pid,stat,args. Sous Linux, ceux avec un code d'état 'D' avec les mêmes pscommandes. Voir l'explication du mot-clé state (OS X) ou la section PROCESS STATE CODES (Linux) dans man pspour plus d'informations. Ou, dans OS X, vous pouvez exécuter topet rechercher des processus marqués comme stuckdans la colonne ÉTAT.
jaume