行き詰まったプロセス:それは悪い兆候ですか?


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_infohttp://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:スレッドは割り込み不可能な待機状態です。

(...)

これは通常、I / Oで待機しているプロセスによって発生します。つまり、プロセスはディスクまたはネットワークの読み取りまたは書き込みを要求し、システムコールが戻るのを待ちます(http://en.wikipedia.orgを参照してください) / wiki / Sleep_%28operating_system%29#Uninterruptible_sleepまたはhttp://www.novell.com/support/kb/doc.php?id=7002725で詳細を確認してください)。

(BSDオプションを使用しない場合、Linuxで通常そうであるように、D状態psとして割り込み不可能なスリープを示します。)

それはプロセスの通常のライフサイクルの一部ですか?

はい、そうです。異常なのは、プロセス長時間この状態にとどまることです。それは悪い兆候です。

特にこのプロセスはなぜですか?

言いにくい。これは通常、ネットワークファイルシステムを使用しているときに、ディスクアクティビティが多いか接続が低下したI / Oボトルネックが原因です(私の経験では最も一般的なシナリオ)。

(これはAsk Askの関連する質問です:https : //apple.stackexchange.com/questions/58697/how-does-stuck-in-results-of-top-relate-to-not-responding-in-activity- m。)


1
どのプロセスが正確にスタックしているかを調べるにはどうすればよいですか?
マレオラフ

3
@mareoraft OS Xで、ps axugまたはの出力に 'U'状態コードを持つものps -eo user,pid,stat,args。Linuxでは、同じpsコマンドで「D」状態コードを持つもの。詳細については、stateキーワードの説明(OS X)またはPROCESS STATE CODESセクション(Linux)を参照man psしてください。または、OS Xでは、STATE列にtopマークさstuckれているプロセスを実行して検索できます。
-jaume
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.