OSのCPU使用率が高い時の対応方法

Linux

サーバの運用保守や監視業務を行っていると、原因不明でCPU使用率が上がっていると言う事象に遭遇することがあります。私も遭遇したことがあり、その瞬間の対応にはとても焦りました。

この記事では、私の業務経験から、CPU使用率が上がった場合の確認方法・手順について解説します。インフラエンジニアとして働いておられる方は、ぜひ最後までお読みください。

CPU使用率とは

CPU使用率とは、コンピュータの頭脳であるCPUが、実行中のプログラムにどれだけ処理能力を使っているかを示す割合です。

分かりやすく例えるなら、パソコンにどのくらいの負荷が掛かっているかを表す指標のようなものです。

CPU使用率が高いほど、パフォーマンスの低迷や予期しないクラッシュが起こる可能性が上がります。

LinuxでCPU使用率が高い時の対応方法

ここでは、CPU使用率が高い時の対応法を4つの項目に分けて解説します。

  1. CPU使用率を確認する
  2. 他に作業している人がいないかを確認する
  3. どのプロセスがCPU使用率高騰の原因になっているかを確認する
  4. ログを確認する

携わっているシステムのCPU使用率が高騰した際には、ここに記載の手順を参考に調査してみてください。

CPU使用率を確認する

まずは「top」コマンドでOSのCPU使用率を確認しましょう。topコマンドの実行後は下記のようになります。

[root ~]# top
top - 19:48:39 up 2 min,  1 user,  load average: 0.17, 0.10, 0.04
Tasks: 231 total,   1 running, 230 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.1 sy,  0.0 ni, 99.1 id,  0.0 wa,  0.7 hi,  0.1 si,  0.0 st
MiB Mem :   1704.7 total,    394.4 free,    750.7 used,    708.9 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.    953.9 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
     38 root      20   0       0      0      0 I   0.3   0.0   0:00.56 kworker/u14:1-events_unbound
     63 root      20   0       0      0      0 I   0.3   0.0   0:00.14 kworker/1:1-events_power_efficient
     92 root      20   0       0      0      0 I   0.3   0.0   0:00.24 kworker/0:2-events
  2997 root      20   0  231640   5728   3548 R   0.3   0.3   0:00.08 top

ここで特に確認したいポイントは上から3行目の「%Cpu(s):~」の部分です。重要な部分なので下記に「%Cpu(s):~」の部分のみを抜き出します。

%Cpu(s): 0.0 us, 0.1 sy, 0.0 ni, 99.1 id, 0.0 wa, 0.7 hi, 0.1 si, 0.0 st

太字に変更した「us」「sy」「ni」の左に記載されている数字の合計値が90を超えると危険な状態です。システムにもよりますが、通常は20%前後になると思います。

他に作業している人がいないかを確認する

他の人がサーバの操作をしていることが原因の可能性も考えられます。そのため「w」コマンドで他の人がログインして作業していないかを確認しましょう。

実行イメージは下記のとおりです。

[root ~]# w
19:48:45 up 2 min, 1 user, load average: 0.14, 0.10, 0.04
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
testuser 19:47 1:56 0.00s 0.06s sshd-session: testuser [priv]

ここで1人だけの場合、1行のみ表示されます。他の作業者がいた場合、下記のようにログインしているユーザの数だけ行数が増えます。

[root ~]# w
20:10:49 up 24 min, 2 users, load average: 0.02, 0.03, 0.00
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
testuser 19:47 24:00 0.00s 0.06s sshd-session: testuser [priv]
testuser 20:10 24:00 0.00s 0.05s sshd-session: testuser [priv]

他に作業者がいた場合、CPU使用率が上がるような操作をしていないかを、historyコマンドなどで確認してみましょう。

どのプロセスがCPU使用率高騰の原因になっているかを確認する

続いて、どのプロセスがCPU使用率を高くしているのかを調査します。調査の際には「ps aux」のコマンドで調査します。実行イメージは下記のとおりです。

[root ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 4024 200 0.2 230716 4300 pts/1 R+ 11:09 0:00 ps aux --sort=-%cpu
root 3922 97.2 0.1 227848 2804 pts/0 R+ 11:07 1:26 grep --color=auto -R test /
gdm 1680 0.4 14.1 4083940 247128 tty1 Sl+ 11:01 0:01 /usr/bin/gnome-shell
root 1 0.2 2.0 44804 36120 ? Ss 11:01 0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize=43 rhgb

この例では、PID 3922 の grep コマンドがCPU使用率97.2%と非常に高い値になっています。そのため、grepコマンドがCPU高騰の原因となっているプロセスであることが分かります。

状況に応じてkillコマンドなどで、プロセスを停止させてCPU使用率を下げましょう。例の中のgrepコマンドのプロセスを停止させるには、下記のコマンドで行えます。

kill 3922

ログを確認する

CPU使用率が上がっている際は、ログにエラーが出ている可能性があります。OSやミドルウェアのデータが記録されているログを確認し、エラーが出力されていないかを確認しましょう。

なお、CPU使用率高騰の原因がOSなのかミドルウェアなのかで、確認が必要なログは異なります。調査の際は、対象のログがどこに出力されるのかを確かめたうえで、確認を行うことが重要です。

例として、OSの何かが原因であれば/var/log/messagesを確認するとよいでしょう。

過去に経験したCPU使用率高騰の原因

ここでは、私が業務で経験してきたことについて記載しようと思います。過去に携わってきた現場の中で、原因不明でCPU使用率が高騰していたことがありました。

具体的には、通常は20%を下回るような値で、高騰していた時はずっと60%前後を推移していました。この記事で記載した通りの方法で対応を行い、セュリティソフトが原因であることまで特定が行えました。しかし、ログを見ても全く原因は分からず…

その後に調べたところ、月初の関係でセキュリティソフトのフルスキャンが行われていたことが、CPU使用率高騰の原因だったようです。ログやプロセスを見ても真の原因追及までは行えないこともあるので、注意しましょう。

コメント

タイトルとURLをコピーしました