Utknął proces: czy to zły znak?

23

Czasami kilka procesów jest zablokowanych. Na przykład:

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

Czy jest to część normalnego cyklu życia procesu? Dlaczego w szczególności ten proces?

Co to dokładnie znaczy?

alecail
źródło

Odpowiedzi:

38

To niekoniecznie zły znak, ale najpierw pozwól mi odpowiedzieć na twoje ostatnie pytanie:

Co to dokładnie znaczy?

W topkodzie źródłowym (z http://www.opensource.apple.com/release/mac-os-x-1082/ ) stan zablokowania jest określany jako identyfikator LIBTOP_STATE_STUCK(z 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
        };
(...)
}

Później w tym samym pliku LIBTOP_STATE_STUCKjest mapowany do stanu jądra 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;
(...)
}

Zatem proces w stanie zablokowanym oznacza, że ​​proces / wątek znajduje się w nieprzerwanym stanie oczekiwania , co TH_STATE_UNINTERRUPTIBLEjest zdefiniowane w strukturze jądra thread_basic_info(patrz http://web.mit.edu/darwin/src/modules/xnu/osfmk/ man / thread_basic_info.html ):

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

gdzie run_statejest:

run_state: stan uruchomienia wątku. Możliwe wartości to:

(...)

  • TH_STATE_UNINTERRUPTIBLE: Wątek znajduje się w stanie oczekiwania, którego nie można przerwać.

(...)

Jest to zwykle spowodowane przez proces oczekujący na We / Wy, to znaczy, że proces zażądał odczytu lub zapisu na / z dysku lub sieci i czeka na powrót wywołania systemowego (patrz http://en.wikipedia.org / wiki / Sleep_% 28operating_system% 29 # Uninterruptible_sleep lub http://www.novell.com/support/kb/doc.php?id=7002725, aby uzyskać więcej informacji).

(Gdy nie używasz opcji BSD, jak to zwykle ma miejsce w Linuksie, pspokazuje nieprzerwany sen jako stan D. )

Czy jest to część normalnego cyklu życia procesu?

Tak to jest. Nie jest normalne, że proces pozostaje w tym stanie przez długi czas. To zły znak.

Dlaczego w szczególności ten proces?

Trudno powiedzieć. Zwykle jest to spowodowane wąskimi gardłami we / wy o dużej aktywności dysku lub pogorszoną łącznością przy korzystaniu z sieciowych systemów plików (z mojego doświadczenia wynika, że ​​jest to najczęściej stosowany scenariusz).

(Jest to powiązane pytanie w Ask Different: /apple/58697/how-does-stuck-in-results-of-top-relate-to-not-responding-in-activity- m .)

jaume
źródło
1
Jak mogę dowiedzieć się, które procesy dokładnie utknęły?
mareoraft,
3
@mareoraft W OS X: te z kodem stanu „U” na wyjściu ps axuglub ps -eo user,pid,stat,args. W Linuksie, te z kodem stanu „D” z tymi samymi pspoleceniami. Aby man psuzyskać więcej informacji, zobacz objaśnienie słowa kluczowego stanu (OS X) lub sekcja KODY PROCESU STANU (Linux) . Lub w OS X można uruchomić topi poszukać procesów oznaczonych jak stuckw kolumnie STAN.
jaume