Processo preso: é um mau sinal?

21

Às vezes, alguns processos estão em um estado de parada. Por exemplo:

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

É parte do ciclo de vida normal do processo? Por que esse processo em particular?

O que significa exatamente?

    
por alecail 22.11.2012 / 21:28

1 resposta

34

Não é necessariamente um mau sinal, mas deixe-me responder primeiro à sua última pergunta:

O que significa exatamente?

No código-fonte top (de link ), o preso é referido como 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
        };
(...)
}

Posteriormente, no mesmo arquivo, LIBTOP_STATE_STUCK é mapeado para o estado do kernel 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;
(...)
}

Portanto, um processo no estado preso significa que o processo / thread está em um estado de espera ininterrupto , que é como TH_STATE_UNINTERRUPTIBLE é definido na estrutura do kernel thread_basic_info (consulte link ):

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

em que run_state é:

run_state: The thread's run state. Possible values are:

(...)

  • TH_STATE_UNINTERRUPTIBLE: The thread is in an un-interruptible wait state.

(...)

Isso geralmente é causado por um processo aguardando E / S, ou seja, o processo solicitou ler ou gravar em / de disco ou na rede e aguarda a chamada do sistema retornar (consulte link ou link para mais informações).

(Quando não estiver usando as opções do BSD, como é geralmente o caso no Linux, ps mostra o modo de suspensão ininterrupta como estado D .

Isso faz parte do ciclo de vida normal do processo?

Sim, é. O que não é normal é que um processo permaneça neste estado por um longo tempo. Isso é um mau sinal.

Por que este processo em particular?

Difícil dizer. Geralmente é causada por gargalos de E / S com atividade de disco pesada ou conectividade degradada ao usar sistemas de arquivos de rede (o cenário mais comum, na minha experiência).

(Esta é uma questão relacionada no Ask Different: .)

    
por 23.11.2012 / 11:51

Tags