psコマンドで各スレッドの情報を表示

ps コマンドはデフォルトではプロセス単位の出力を行う。
スレッド型サーバで各スレッドの情報を知る必要があったのでメモ。

スレッド系オプション
ps コマンドでスレッド系オプションは以下。ps プログラムにいずれかのオプションを渡して、スレッド数分表示させればOK

  • H Show threads as if they were processes
  • -L Show threads, possibly with LWP(light weight process) and NLWP(number of light weight process) columns
  • -T Show threads, possibly with SPID column
  • m Show threads after processes
  • -m Show threads after processes

実行例
マルチスレッドで動いている MongoDB(あるいは MySQL とか) の場合、以下のようになる。

$ ps uH -u  mongodb
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
mongodb   1069  0.2  0.2  84384  9500 ?        Ssl  Jul23  51:25 /usr/bin/mongod --config /etc/mongodb.conf
mongodb   1069  0.0  0.2  84384  9500 ?        Ssl  Jul23   0:00 /usr/bin/mongod --config /etc/mongodb.conf
mongodb   1069  0.0  0.2  84384  9500 ?        Ssl  Jul23   0:01 /usr/bin/mongod --config /etc/mongodb.conf
mongodb   1069  0.0  0.2  84384  9500 ?        Ssl  Jul23   0:00 /usr/bin/mongod --config /etc/mongodb.conf
mongodb   1069  0.0  0.2  84384  9500 ?        Ssl  Jul23   0:12 /usr/bin/mongod --config /etc/mongodb.conf
mongodb   1069  0.0  0.2  84384  9500 ?        Ssl  Jul23   0:16 /usr/bin/mongod --config /etc/mongodb.conf
mongodb   1069  0.0  0.2  84384  9500 ?        Ssl  Jul23   0:00 /usr/bin/mongod --config /etc/mongodb.conf
mongodb   1069  0.2  0.2  84384  9500 ?        Ssl  Jul23  49:29 /usr/bin/mongod --config /etc/mongodb.conf

出力フォーマットの指定
LWP、NLWP など、出力情報を個別に指定したい場合は以下のようになる

$ ps xo user,pid,ppid,lwp,nlwp,etime,stat,cmd -L -u mongodb
USER       PID  PPID   LWP NLWP     ELAPSED STAT CMD
mongodb   1069     1  1069    8 12-23:14:23 Ssl  /usr/bin/mongod --config /etc/mongodb.conf
mongodb   1069     1  1104    8 12-23:14:22 Ssl  /usr/bin/mongod --config /etc/mongodb.conf
mongodb   1069     1  1105    8 12-23:14:22 Ssl  /usr/bin/mongod --config /etc/mongodb.conf
mongodb   1069     1  1109    8 12-23:14:22 Ssl  /usr/bin/mongod --config /etc/mongodb.conf
mongodb   1069     1  1111    8 12-23:14:21 Ssl  /usr/bin/mongod --config /etc/mongodb.conf
mongodb   1069     1  1112    8 12-23:14:21 Ssl  /usr/bin/mongod --config /etc/mongodb.conf
mongodb   1069     1  1113    8 12-23:14:21 Ssl  /usr/bin/mongod --config /etc/mongodb.conf
mongodb   1069     1  1114    8 12-23:14:21 Ssl  /usr/bin/mongod --config /etc/mongodb.conf
...

PID は同じで LWP が異なるプロセスが NLWP の数だけ存在している。
STAT 列を確認すると、Ssl。

  • S:Interruptible sleep (waiting for an event to complete)
  • s:session leader
  • l:multi-threaded (using CLONE_THREAD, like NPTL pthreads do)

“l” が含まれているので、確かにマルチスレッド型サーバ。

 フォーク型との比較

念のため、フォーク型サーバでの表示も確認。
次のような超簡易 fork 型サーバを用意。

# server-fork.py
import SocketServer

class RequestHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        data = self.request.recv(1024)
        self.request.sendall(data)

if __name__ == "__main__":
    server = SocketServer.ForkingTCPServer(('', 9999), RequestHandler)
    server.serve_forever()
    server.shutdown()

サーバを起動後に telnet で接続し、 ps 結果を確認してみる。

$ ps xo pid,ppid,lwp,nlwp,etime,stat,cmd -L -u xxx
PID  PPID   LWP NLWP     ELAPSED STAT CMD
...
2770 26896  2770    1       01:42 S+   python server-fork.py
2771  1870  2771    1       01:38 S+   telnet localhost 9999
2772  2770  2772    1       01:38 S+   python server-fork.py
2773 28029  2773    1       01:26 S+   telnet localhost 9999
2774  2770  2774    1       01:26 S+   python server-fork.py
2775 26835  2775    1       01:19 S+   telnet localhost 9999
2776  2770  2776    1       01:19 S+   python server-fork.py
...

PID:2770 でサーバが起動したあと、サーバへの接続があるたびにフォークして PPID:2770 のプロセスが生成されている。また TELNET プロセスの起動時間と TELNET 接続時に fork されたプロセスの elapsed time が同じになっている(prefork だとまた別)。
STAT 列を確認すると “S+”

  • S:Interruptible sleep (waiting for an event to complete)
  • +:in the foreground process group

ということで、マルチスレッドを表す “l” は含まれておらず、確かにフォーク型サーバになっている。

めでたし、めでたし。

References

Tagged with: , ,
Posted in linux

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
%d bloggers like this: