MAGAZINE
ルーターマガジン
topコマンド、psコマンドでサーバ上の高負荷なプロセスを探してkillする - Linux編
こんにちは。学生アルバイトの大木です。
突然ですが、皆さんは自分のパソコン以外のサーバを使っていますか?また、そのサーバのスペックはどれくらいですか?最近では、ノートパソコンでもメモリが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ではコマンドが異なるのでご注意ください。
CONTACT
お問い合わせ・ご依頼はこちらから