さくらVPSでCPU使用率が異常になったので対処する
サーバがやたらと重く、linuxのcdコマンドすらssh接続で打ちにくい状態であったので、さくらVPSのリソース情報を調査したところ、CPUの使用率が異常に上昇していた。
この原因を特定し、普段の状態に戻す事を目指す。
さくらVPSのリソース情報を把握
さくらVPSはコンソールでCPUの使用状態が分かるため、まずは現状を把握して原因を考えたい。
CPU使用状況
DISK I/O
まずCPUは順調に使用率が上がってきている。公式サイトに見解は無つけられなかったが、他の筋の情報によると、CPU時間は1コア当たり1000msecが限界値であり、契約サーバは2コアであるため、このままのペースでいくと1週間以内にダウンしてしまいそうである。
サーバの重さからしてもその程度であろうと想像がつく。
ディスクへのアクセスも増えてきている。ただ、ディスクの読み込みは増えているが、書き込み量は増えている訳ではない。
使用状況から考えると、この一週間でサーバを一度も触らなかったので外部からのアクセスが増えているか、あるいは内部で走っているクーロンあたりが悪さをしているのかどちらかである。
ただし、外部アクセスの場合はログが急増してディスクへの書き込み量が増えることが予想されることから今回は内部に問題がありそうである。
Linuxのtopコマンドでサーバの稼働状態を把握
LinuxにはCPU使用率を見るコマンドとしてtopコマンドがある。これを叩くと1秒ごとに、現在のプロセスとそのCPU使用率を表示してくれる。
Windowsで言うとCtrl + Shift + Escキーを同時押しして表示するタスクマネージャーに相当する機能である。ともあれこれを試してみる。
$ top
すると次のように表示された。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
15814 yamanaka 20 0 1084388 324688 4332 R 132.6 31.9 8345:09 chrome
21120 yamanaka 20 0 765428 18784 3060 R 2.7 1.8 287:01.54 chrome
38 root 20 0 0 0 0 S 1.0 0.0 525:07.44 kswapd0
11 root 20 0 0 0 0 S 0.3 0.0 101:03.52 rcu_sched
2795 yamanaka 20 0 887572 8344 2796 S 0.3 0.8 489:50.81 PM2 v3.2.9: God
2997 yamanaka 20 0 885008 4556 1756 S 0.3 0.4 129:56.81 node
15581 yamanaka 20 0 162032 1856 1056 R 0.3 0.2 0:00.24 top
18712 yamanaka 20 0 495184 1116 1104 S 0.3 0.1 0:31.63 chrome
何とchromeのCPU使用率が100%を超えている。何故100%以上の表示が出るのかは知らないが、ともあれこれが原因であることは間違え無さそうである。
chromeはpuppeteerというWebサイトの情報を自動で収集するオープンソースソフトウェアで使用しており、これをcronで定期的に実行しているものの、上手く終了しないケースが多く徐々にCPUリソースが食われていたと考えられる。
自動収集ソフトは収集先のサーバに問題があった場合には例外を投げるが、この例外を投げた時にchromeを終了させていない(=エラーハンドリングが正しくできていない)ことがどうやら主因であった。
プロセスを殺して再度CPUの使用状態を確認
PID 15814が大きくCPUを使用していることが分かったので、これをkillしてやる。
kill 15814
ところが、複数chromeのプロセスが動いており、これらをまとめて全てkillしたい。psmiscを入れてkillall
コマンドが使えるようにする。
$ sudo yum install psmisc
$ killall chrome
これでchromeのプロセスを全て終了させることができた。
CPUの使用が劇的に改善
最後に結果を見てみよう。コロナショック時の株価のように使用時間が減少していることが見て取れる。
この画像はkill 15814
のみを実行した後のキャプチャであるが、全てのchromeプロセスを終了させたところ、CPU使用率がほぼ0msecとなった。
まとめ
今回はpuppeteerがchromeを終了させていないという問題であったが、topコマンドでcpu使用率を確認して、killやkillallを用いて不要なプロセスを終了させることは汎用的に使える技である。
是非同様のケースがあった場合に使用していきたいものである。