Застрял процесс: это плохой знак?

23

Иногда несколько процессов находятся в застрявшем состоянии. Например:

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

Является ли это частью нормального жизненного цикла процесса? Почему именно этот процесс?

Что это значит именно?

alecail
источник

Ответы:

38

Это не обязательно плохой знак, но позвольте мне сначала ответить на ваш последний вопрос:

Что это значит именно?

В topисходном коде (из http://www.opensource.apple.com/release/mac-os-x-1082/ ) застрявшее состояние называется идентификатором LIBTOP_STATE_STUCK(из 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
        };
(...)
}

Позже в этом же файле LIBTOP_STATE_STUCKотображается состояние ядра 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;
(...)
}

Таким образом, процесс в застрявшем состоянии означает, что процесс / поток находится в состоянии непрерывного ожидания , которое TH_STATE_UNINTERRUPTIBLEопределено в структуре ядра thread_basic_info(см. Http://web.mit.edu/darwin/src/modules/xnu/osfmk/ man / thread_basic_info.html ):

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

где run_stateнаходится:

run_state: состояние выполнения потока. Возможные значения:

(...)

  • TH_STATE_UNINTERRUPTIBLE: Поток находится в непрерывном состоянии ожидания.

(...)

Это обычно вызывается процессом, ожидающим ввода-вывода, то есть процесс запросил чтение или запись на диск или с диска или в сеть и ожидает возврата системного вызова (см. Http://en.wikipedia.org / wiki / Sleep_% 28operating_system% 29 # Uninterruptible_sleep или http://www.novell.com/support/kb/doc.php?id=7002725 для получения дополнительной информации).

(Когда параметры BSD не используются, как это обычно бывает в Linux, psв режиме D отображается непрерывный сон ).

Является ли это частью нормального жизненного цикла процесса?

Да, это. Что не является нормальным, так это то, что процесс остается в этом состоянии в течение длительного времени. Это плохой знак.

Почему именно этот процесс?

Сложно сказать. Обычно это вызвано узкими местами ввода / вывода с высокой активностью диска или ухудшением соединения при использовании сетевых файловых систем (самый обычный сценарий, по моему опыту).

(Это связанный вопрос в разделе Спросите: /apple/58697/how-does-stuck-in-results-of-top-relate-to-not-responding-in-activity- м .)

Жауме
источник
1
Как я могу узнать, какие процессы застряли?
mareoraft
3
@mareoraft В OS X, те с кодом состояния 'U' на выходе ps axugили ps -eo user,pid,stat,args. В Linux те с кодом состояния 'D' с теми же psкомандами. Посмотрите объяснение ключевого слова состояния (OS X) или раздела КОДОВ СОСТОЯНИЯ ПРОЦЕССА (Linux) в man psдля получения дополнительной информации. Или в OS X вы можете запускать topи искать процессы, отмеченные как stuckв столбце STATE.
Jaume