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


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

Це частина нормального життєвого циклу процесу? Чому саме цей процес?

Що це означає саме?

Відповіді:


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. )

Це частина нормального життєвого циклу процесу?

Так. Що не нормально, це те, що процес залишається в такому стані тривалий час. Це поганий знак.

Чому саме цей процес?

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

(Це пов’язане запитання у Ask Different: /apple/58697/how-does-stuck-in-results-of-top-relate-to-not-responding-in-activity- м .)


1
Як я можу дізнатися, які саме процеси застрягли?
мареофт

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у стовпці ДЕРЖАВНІ.
jaume
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.