プロセス状態

概要

プロセスの状態について調べたことのメモ。

sleeping

とあるホストでpsコマンドを叩くとほとんどプロセスの状態がsleepになっていた。

$ ps auxf
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         2  0.0  0.0      0     0 ?        S    Nov16   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    Nov16   0:00  \_ [migration/0]
root         4  0.0  0.0      0     0 ?        S    Nov16   0:00  \_ [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S    Nov16   0:00  \_ [stopper/0]
root         6  0.0  0.0      0     0 ?        S    Nov16   0:00  \_ [watchdog/0]
root         7  0.0  0.0      0     0 ?        S    Nov16   0:08  \_ [events/0]
root         8  0.0  0.0      0     0 ?        S    Nov16   0:00  \_ [events/0]
root         9  0.0  0.0      0     0 ?        S    Nov16   0:00  \_ [events_long/0]
root        10  0.0  0.0      0     0 ?        S    Nov16   0:00  \_ [events_power_ef]
root        11  0.0  0.0      0     0 ?        S    Nov16   0:00  \_ [cgroup]
root        12  0.0  0.0      0     0 ?        S    Nov16   0:00  \_ [khelper]

・
・
root         1  0.0  0.0  19232  1236 ?        Ss   Nov16   0:01 /sbin/init
root       537  0.0  0.0  11248   344 ?        S<s  Nov16   0:00 /sbin/udevd -d
root      1628  0.0  0.0  12400   552 ?        S<   Nov16   0:00  \_ /sbin/udevd -d
root      1629  0.0  0.0  12400   552 ?        S<   Nov16   0:00  \_ /sbin/udevd -d
root      1155  0.0  0.0  27596   712 ?        S<sl Nov16   0:00 auditd
root      1177  0.0  0.0 249088  1264 ?        Sl   Nov16   0:00 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
rpc       1203  0.0  0.0  18980   512 ?        Ss   Nov16   0:00 rpcbind
root      1362  0.0  0.0 200108  1432 ?        S    Nov16   0:19 /usr/sbin/snmpd -LS0-6d -Lf /dev/null -p /var/run/snmpd.pid
root      1388  0.0  0.0  66236   604 ?        Ss   Nov16   0:00 /usr/sbin/sshd
root     20200  0.0  0.0 102084  4464 ?        Ss   07:56   0:00  \_ sshd: root@pts/0 
root     20206  0.0  0.0 111880  5592 pts/0    Ss   07:56   0:00      \_ -bash
root     23654  3.0  0.0 110352  1152 pts/0    R+   08:30   0:00          \_ ps auxf

実行可能状態のプロセスはこのコマンドを打ったpsのみ。他は全部S。

straceで処理をみる

straceでどんな処理をしているのかを見てみた。

適当にプロセスを選ぶ

$ strace -p 1615
Process 1615 attached
read(0, 
$ strace -p 1388
Process 1388 attached
select(6, [3], NULL, NULL, NULL

別の端末でvmstat 1で1秒おきに表示

root     24143  1.3  0.0 102084  4340 ?        Ss   08:38   0:00  \_ sshd: root@pts/1 
root     24149  1.0  0.0 111896  5528 pts/1    Ss   08:39   0:00      \_ -bash
root     24185  0.0  0.0   6260   696 pts/1    S+   08:39   0:00          \_ vmstat 1

vmstatをstraceでみてみた。これもpsでみるとS

$ strace -p 24185
Process 24185 attached
restart_syscall(<... resuming interrupted call ...>) = 0
lseek(3, 0, SEEK_SET)                   = 0
read(3, "MemTotal:        8001920 kB\nMemF"..., 2047) = 1170
lseek(4, 0, SEEK_SET)                   = 0
read(4, "cpu  717231 881 184526 16100359 "..., 65535) = 1152
lseek(5, 0, SEEK_SET)                   = 0
read(5, "nr_free_pages 1161281\nnr_inactiv"..., 2047) = 1912
write(1, " 0  0  23164 4645124 206708 2733"..., 85) = 85
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({1, 0}, 0x7ffd056041d0)       = 0

なぜsleepだけなのか

straceでプロセスをみると、readやwriteやsleepなどの処理が実行されている。たぶん、プロセスの処理の中でこれが大半を占めていて、待ちになっている割合のほうが多いと思われる。もちろんそれ以外のプログラムの箇所もあるだろうが、わずかで一瞬で終わるのじゃないだろうか。Rの状態はあるけれども一瞬過ぎてpsなどでは捉えられない?