Gazelle
2020年04月03日公開 1989 Views

さくらVPSでCPU使用率が異常になったので対処する

サーバがやたらと重く、linuxのcdコマンドすらssh接続で打ちにくい状態であったので、さくらVPSのリソース情報を調査したところ、CPUの使用率が異常に上昇していた。

この原因を特定し、普段の状態に戻す事を目指す。

さくらVPSのリソース情報を把握

さくらVPSはコンソールでCPUの使用状態が分かるため、まずは現状を把握して原因を考えたい。

CPU使用状況
image.png

DISK I/O
image.png

まず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の使用が劇的に改善

最後に結果を見てみよう。コロナショック時の株価のように使用時間が減少していることが見て取れる。
image.png

この画像はkill 15814のみを実行した後のキャプチャであるが、全てのchromeプロセスを終了させたところ、CPU使用率がほぼ0msecとなった。

まとめ

今回はpuppeteerがchromeを終了させていないという問題であったが、topコマンドでcpu使用率を確認して、killやkillallを用いて不要なプロセスを終了させることは汎用的に使える技である。

是非同様のケースがあった場合に使用していきたいものである。

関連記事

CentOS7環境においてnginxとrails6、PUMAアプリケーションサーバを組み合わせ、RailsアプリケーションをProductionモードで動作させる手順を説明します。
2020年03月15日
ps axuをして全プロセスを表示し、該当するpidを指定してkillすれば良いという話
2020年03月18日
Railsアプリの独自ドメイン取得からSSL設定まで一貫して行います。環境はCentOS7、サーバはNginx、SSL化には無料のLet's Encryptを使用。
2020年03月18日
node用version管理ツールnvmをインストールして、任意のnode versionを使う方法を解説
2020年07月30日
cronがうまく動かせない時はbashファイルの読み込み、実行ユーザ、相対パスの起点について疑ってみると大体動くようになるという話
2020年10月17日
VPS難民エンジニアがさくらVPS、ConoHa、LightSail、Indigoの4つの大手VPSレンタルサーバーを徹底比較。Webサイトの立ち上げやLinuxの勉強用に使い勝手の良いVPSを教えます。
2021年04月25日
Linuxのsedコマンドを使えば、簡単にファイル内の置換を行うことができる。正規表現のスラッシュ区切りを使わずにバーティカルバーを使って簡潔に書くことも可読性を高めるうえでは重要なテクニックとなる。
2021年07月07日
ホームへ戻る