プロセス状態
概要
プロセスの状態について調べたことのメモ。
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などでは捉えられない?