Terjebak proses: apakah itu pertanda buruk?

23

Terkadang beberapa proses dalam kondisi macet. Sebagai contoh:

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

Apakah itu bagian dari siklus hidup normal? Mengapa proses ini khususnya?

Apa artinya sebenarnya?

alecail
sumber

Jawaban:

38

Itu belum tentu pertanda buruk, tetapi izinkan saya menjawab pertanyaan terakhir Anda terlebih dahulu:

Apa artinya sebenarnya?

Dalam topkode sumber (dari http://www.opensource.apple.com/release/mac-os-x-1082/ ) keadaan macet disebut sebagai pengidentifikasi LIBTOP_STATE_STUCK(dari 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
        };
(...)
}

Kemudian dalam file yang sama, LIBTOP_STATE_STUCKdipetakan ke kondisi 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;
(...)
}

Jadi suatu proses dalam keadaan macet berarti bahwa proses / utas berada dalam keadaan tunggu yang tidak dapat diputus , yang adalah bagaimana TH_STATE_UNINTERRUPTIBLEdidefinisikan dalam kernel struct thread_basic_info(lihat http://web.mit.edu/darwin/src/modules/xnu/osfmk/ man / thread_basic_info.html ):

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

dimana run_stateadalah:

run_state: Status menjalankan utas. Nilai yang mungkin adalah:

(...)

  • TH_STATE_UNINTERRUPTIBLE: Utas ini dalam kondisi tunggu yang tidak terputus.

(...)

Ini biasanya disebabkan oleh proses menunggu di I / O, yaitu, proses telah meminta untuk membaca atau menulis ke / dari disk atau jaringan dan menunggu panggilan sistem untuk kembali (lihat http://en.wikipedia.org / wiki / Sleep_% 28operating_system% 29 # Tidak terputus atau http://www.novell.com/support/kb/doc.php?id=7002725 untuk informasi lebih lanjut).

(Ketika tidak menggunakan opsi BSD, seperti yang biasanya terjadi di Linux, psmenunjukkan sleep yang tidak pernah terputus sebagai status D. )

Apakah ini bagian dari siklus hidup normal?

Ya itu. Apa yang tidak normal adalah bahwa suatu proses tetap dalam keadaan ini untuk waktu yang lama. Itu pertanda buruk.

Mengapa proses ini khususnya?

Sulit dikatakan. Ini biasanya disebabkan oleh kemacetan I / O dengan aktivitas disk yang berat atau konektivitas yang menurun ketika menggunakan sistem file jaringan (skenario yang paling umum, menurut pengalaman saya).

(Ini adalah pertanyaan terkait di Ask Different: /apple/58697/how-does-stuck-in-result-of-top-relate-to-not-ponding-in-activity- m .)

Jaume
sumber
1
Bagaimana saya bisa mengetahui proses mana yang benar-benar macet?
mareoraft
3
@mareoraft Di OS X, yang dengan kode status 'U' di output ps axugatau ps -eo user,pid,stat,args. Di Linux, yang dengan kode negara 'D' dengan psperintah yang sama . Lihat penjelasan kata kunci negara (OS X) atau bagian KODE NEGARA PROSES (Linux) di man psuntuk informasi lebih lanjut. Atau, di OS X, Anda bisa menjalankan topdan mencari proses yang ditandai stuckdi kolom STATE.
jaume