こんにちは。学生アルバイトの大木です。

突然ですが、皆さんは自分のパソコン以外のサーバを使っていますか?また、そのサーバのスペックはどれくらいですか?最近では、ノートパソコンでもメモリが8GB程度あるのが一般的であったりと、自前のパソコンの方がサーバよりスペックが高いことが多いのではないでしょうか。なので、ローカル環境ではうまくいっていた処理であっても、サーバ上で行う時はメモリの利用率などを確認しながら作業しないとサーバが落ちてしまう可能性もあります。場合によっては、あるプロセスをキルしなければならないこともあるでしょう。

今回は、そのような時のサーバ上のプロセスの追い方を紹介したいと思います。弊社では、クローラーを作成する際に、seleniumを使う機会が多いです。seleniumはWebブラウザを直接操作することが可能であるため、非常に便利です。しかし、ブラウザを起動するため、メモリ利用率を圧迫してしまいます。そこで今回は、seleniumを用いたクローラーを動かしている状況を例に考えたいと思います。

全体のメモリ利用率を確認

まずはtopコマンドでサーバ全体のメモリ利用率を確認します。ここでは、seleniumを用いたrubyファイルを3つ実行しています。また、topコマンド実行中にmを押すと、4行目に全体のメモリ利用率が表示され、shift+mを押すと、プロセスの一覧をメモリの使用率が高い順に並べ替えることができます。

#top

top - 12:32:13 up 20 days, 16:15,  1 user,  load average: 1.04, 0.57, 0.35
Tasks: 115 total,   4 running,  69 sleeping,   0 stopped,   0 zombie
%Cpu(s): 61.5 us, 11.1 sy,  0.0 ni, 26.7 id,  0.0 wa,  0.0 hi,  0.7 si,  0.0 st
KiB Mem : 89.1/985100   [|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||         ]
KiB Swap:  0.0/0        [                                                                                ]

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                               
 37686 root      20   0  890548 293656 143912 R 45.6 29.8   0:31.66 /opt/google/chrome/chrome --type=rend+
 37649 root      20   0  721716 196932 139700 S 18.0 20.0   0:07.89 /usr/bin/google-chrome --disable-back+
 37414 root      20   0  745688 163296  90180 R 14.6 16.6   0:09.21 /opt/google/chrome/chrome --type=rend+
 37550 root      20   0  726068 139892  82940 R  4.5 14.2   0:06.48 /opt/google/chrome/chrome --type=rend+
 37376 root      20   0  634068 120764  87860 S  0.8 12.3   0:02.73 /usr/bin/google-chrome --disable-back+
 37513 root      20   0  613904 109396  81572 S  1.7 11.1   0:01.70 /usr/bin/google-chrome --disable-back+
 37539 root      20   0  435744  51824  42424 S  0.0  5.3   0:00.04 /opt/google/chrome/chrome --type=gpu-+
 37404 root      20   0  435776  51676  42248 S  0.0  5.2   0:00.04 /opt/google/chrome/chrome --type=gpu-+
 37675 root      20   0  435744  51360  41964 S  0.0  5.2   0:00.04 /opt/google/chrome/chrome --type=gpu-+
 37521 root      20   0  396704  43808  35140 S  0.0  4.4   0:00.02 /opt/google/chrome/chrome --type=zygo+
 37384 root      20   0  396704  43652  34984 S  0.0  4.4   0:00.02 /opt/google/chrome/chrome --type=zygo+
 37657 root      20   0  396704  43600  34936 S  0.0  4.4   0:00.02 /opt/google/chrome/chrome --type=zygo+
 37567 root      20   0   91544  24888   8524 S  0.0  2.5   0:00.61 ruby main.rb                          
 37431 root      20   0   90936  24688   8540 S  0.0  2.5   0:00.58 ruby main3.rb                         
 37294 root      20   0   91212  24504   8328 S  0.0  2.5   0:00.61 ruby main2.rb     
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~      

これで全体のメモリ利用率を確認できました。また、chromeのメモリ利用率がとても高くなっています。特に、一番メモリ利用率が高いものでは、29.8%です。なので今回は、このサーバ上ではrubyファイルを2つ実行するのが限界であると判断し、一番メモリ利用率が高く、プロセスIDが”37686″であるchromeの親プロセスをキルしようと思います。しかし、これだと親プロセスが分かりづらいですね。そこで、psコマンドを使ってみましょう。

親プロセスを探す

psはLinux上で現在動作しているプロセスを表示するコマンドです。psに続く文字はオプションを表しています。今回の場合、以下の4つのオプションを追加しています。

  • aオプション

  • 他の端末を含め、端末操作のプロセスを表示するオプションです。
  • uオプション

  • CPUやメモリの使用率なども表示するオプションです。
  • xオプション

  • 現在実行しているプロセスのみを表示するオプションです。
  • fオプション

  • プロセスをツリー構造にして表示するオプションです。

実行結果は以下のようになります。

# ps auxf
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

root        495  0.0  0.1  72296  1436 ?        Ss   Oct16   0:00 /usr/sbin/sshd -D
root      21506  0.0  0.4 107992  4400 ?        Ss   10:21   0:01  \_ sshd: root@pts/0
root      21556  0.0  0.5  22672  5396 pts/0    Ss   10:21   0:00      \_ -bash
root      37294  0.5  2.4  91212 24548 pts/0    Sl   12:30   0:00          \_ ruby main2.rb
root      37367  0.0  1.0 113492 10292 pts/0    Sl   12:30   0:00          |   \_ /usr/local/bin/chromedriv
root      37376  3.3 10.9 645924 108244 pts/0   Sl   12:30   0:04          |       \_ /usr/bin/google-chrom
root      37381  0.0  0.0   7344   744 pts/0    S    12:30   0:00          |           \_ cat
root      37382  0.0  0.0   7344   768 pts/0    S    12:30   0:00          |           \_ cat
root      37384  0.0  2.7 396704 27260 pts/0    S    12:30   0:00          |           \_ /opt/google/chrom
root      37414 12.7 16.7 761928 165136 pts/0   Sl   12:30   0:15          |           |   \_ /opt/google/c
root      37404  0.0  3.2 435776 31812 pts/0    Sl   12:30   0:00          |           \_ /opt/google/chrom
root      37431  0.9  2.5  91068 24716 pts/0    Sl   12:30   0:01          \_ ruby main3.rb
root      37504  0.0  1.1 113460 10940 pts/0    Sl   12:30   0:00          |   \_ /usr/local/bin/chromedriv
root      37513  2.3  9.0 614240 89004 pts/0    Sl   12:30   0:02          |       \_ /usr/bin/google-chrom
root      37518  0.0  0.0   7344   828 pts/0    S    12:30   0:00          |           \_ cat
root      37519  0.0  0.0   7344   836 pts/0    S    12:30   0:00          |           \_ cat
root      37521  0.0  2.7 396704 27580 pts/0    S    12:30   0:00          |           \_ /opt/google/chrom
root      37550  8.6 12.8 729732 126968 pts/0   Sl   12:30   0:09          |           |   \_ /opt/google/c
root      37539  0.0  3.2 435744 31856 pts/0    Sl   12:30   0:00          |           \_ /opt/google/chrom
root      37567  0.5  2.5  91544 24888 pts/0    Sl   12:30   0:00          \_ ruby main.rb
root      37640  0.2  1.1 114484 11736 pts/0    Sl   12:30   0:00          |   \_ /usr/local/bin/chromedriv
root      37649  8.6 16.6 709808 164328 pts/0   Sl   12:30   0:09          |       \_ /usr/bin/google-chrom
root      37654  0.0  0.0   7344   880 pts/0    S    12:30   0:00          |           \_ cat
root      37655  0.0  0.0   7344   780 pts/0    S    12:30   0:00          |           \_ cat
root      37657  0.0  2.7 396704 27340 pts/0    S    12:30   0:00          |           \_ /opt/google/chrom
root      37686 37.6 28.9 892988 285664 pts/0   Rl   12:30   0:42          |           |   \_ /opt/google/c
root      37675  0.0  3.2 435744 31648 pts/0    Sl   12:30   0:00          |           \_ /opt/google/chrom
root      37747  0.0  0.3  37252  3448 pts/0    R+   12:32   0:00          \_ ps auxf


上記のように、一番メモリを利用していて(28.9%)、プロセスIDが”37686″であるchromeプロセスの親プロセスはmain.rbでした。あとは、これらをキルしたり、監視を強めたりしましょう。

まとめ

今回はLinuxサーバ上でのプロセスの追い方の一例について紹介させていただきましたが、他のOSではコマンドが異なるのでご注意ください。