LinuxでCPU使用率が高いときの確認方法|top・psで原因プロセスを調べる

Linuxサーバーを運用していると、「サイトの表示が遅い」「SSHの操作が重い」「サーバーのCPU使用率が高い」といった問題が発生することがあります。

CPU使用率が高いからといって、すぐにCPUそのものが不足しているとは限りません。

アプリケーションの処理、データベース、Dockerコンテナ、cronによる定期処理など、特定のプロセスがCPUを大量に消費している可能性があります。

そのため、まずはどのプロセスがCPUを使っているのかを確認することから始めます。

LinuxのCPU使用率が高いときに確認する順番

CPU負荷を調べるときは、次のような順番で確認すると分かりやすくなります。

  1. CPU全体の負荷を確認する
  2. CPUを大量に使っているプロセスを確認する
  3. 特定のプロセスが継続して負荷をかけているか確認する
  4. アプリケーションやDockerなど原因を調べる
  5. cronやバックアップなど定期処理を確認する
  6. 必要に応じてプロセスを停止・再起動する

いきなりプロセスを終了するのではなく、まず原因を確認することが重要です。

topコマンドでCPU使用率を確認する

LinuxでCPU負荷を確認するときによく使われるのがtopです。

top

実行すると、CPU使用率やメモリ使用量、実行中のプロセスなどがリアルタイムで表示されます。

例えば、

%Cpu(s): 35.0 us, 5.0 sy, 0.0 ni, 60.0 id

のような情報が表示されます。

ここで、

  • us:ユーザープロセスによるCPU使用
  • sy:カーネルなどシステム処理によるCPU使用
  • id:CPUがアイドル状態の割合
  • wa:I/O待ちの割合

などを確認できます。

CPU使用率が高いときは、プロセス一覧も合わせて確認してください。

CPUを使っているプロセスを確認する

topの画面では、CPU使用率の高いプロセスを確認できます。

通常はCPU使用率が高いプロセスが上のほうに表示されます。

特定のプロセスが大量にCPUを使用している場合、

PID     USER      %CPU    COMMAND
1234    www-data  95.0    php-fpm

のように表示されます。

この場合、php-fpmがCPUを大量に消費していることが分かります。

ただし、一時的にCPUを使っただけの可能性もあるため、しばらく画面を確認して継続しているかを見ることも大切です。

psコマンドでCPU使用率を確認する

topを終了してから確認したい場合は、psも便利です。

CPU使用率の高いプロセスを確認するなら、

ps aux --sort=-%cpu | head

とします。

CPU使用率の高いプロセスから順番に表示されます。

もう少し多く確認したい場合は、

ps aux --sort=-%cpu | head -20

とします。

これによって、現在CPUを多く使用しているプロセスを一覧で確認できます。

CPU使用率が高いプロセスを特定する

CPU負荷が高いときは、まずPIDを確認します。

例えば、

PID
1234

というプロセスが高負荷になっているとします。

次に、

ps -p 1234 -o pid,ppid,user,%cpu,%mem,etime,cmd

とすると、そのプロセスについて詳しく確認できます。

ここでは、

  • PID
  • 親プロセス
  • 実行ユーザー
  • CPU使用率
  • メモリ使用率
  • 実行時間
  • 実行コマンド

などを確認できます。

特にPPIDとCMDを見ると、どのサービスや処理から起動されたプロセスなのかを調べる手がかりになります。

CPU使用率が高いプロセスをすぐにkillしてもいい?

CPUを大量に使っているプロセスを見つけると、すぐにkillしたくなるかもしれません。

しかし、プロセスによっては、

  • Webサイト
  • データベース
  • バックアップ
  • バッチ処理
  • cron
  • Dockerコンテナ

など、サーバーに必要な処理が動いている可能性があります。

そのため、まずプロセスの正体を確認してください。

サービスとして管理されている場合は、

sudo systemctl status サービス名

などで状態を確認します。

アプリケーションがCPUを使っている場合

WebアプリケーションのプロセスがCPUを大量に使用している場合は、アプリケーション側の処理を確認します。

例えば、

  • 無限ループ
  • 大量のデータ処理
  • 重いAPI処理
  • 異常なアクセス
  • キャッシュの問題
  • データベースへの大量クエリ

などが原因になることがあります。

CPU使用率だけを見て原因を断定せず、アプリケーションのログも確認しましょう。

DockerコンテナのCPU使用率を確認する

Dockerを使用している場合は、docker statsが便利です。

docker stats

コンテナごとのCPU使用率やメモリ使用量などを確認できます。

例えば、

CONTAINER    CPU %
web          85.20%
db           12.40%

のようになっていれば、webコンテナがCPUを多く使用していることが分かります。

その場合は、

docker logs コンテナ名

でログを確認し、コンテナ内のアプリケーションに異常がないか調べます。

cronが原因になっていないか確認する

CPU使用率が一定の時間帯だけ高くなる場合は、cronによる定期処理も確認してください。

例えば、

  • バックアップ
  • ログ処理
  • データ集計
  • ファイル変換
  • バッチ処理

などが定期的に実行されている可能性があります。

cronの設定を確認する場合は、

crontab -l

を実行します。

rootのcronを確認する場合は、

sudo crontab -l

です。

CPU負荷が高くなった時刻とcronの実行時刻が一致していないか確認すると、原因を絞り込みやすくなります。

CPU負荷が高い時間帯を確認する

現在のCPU使用率だけでは、過去に何が起きたのか分からないことがあります。

例えば、「毎日午前3時になるとサーバーが重くなる」という場合です。

このようなケースでは、cronやバックアップなどの定期処理を調べる必要があります。

ログや監視ツールを利用して、CPU負荷が上がる時間帯を確認してください。

現在の状態だけで判断せず、いつから・どの時間帯に・どの程度の負荷が発生しているのかを見ることが重要です。

load averageも確認する

topには、CPU使用率だけでなくload averageも表示されます。

例えば、

load average: 4.20, 3.80, 2.50

のように表示されます。

これは一定期間のシステム負荷を示す指標です。

ただし、load averageだけを見て「CPUが100%だから危険」と単純に判断することはできません。

CPUコア数やI/O待ちなども関係するため、CPU使用率やプロセスの状態と合わせて確認してください。

CPU使用率が高くてもCPUが原因とは限らない

サーバーが重いときは、CPUだけでなくメモリやディスクI/Oも確認する必要があります。

例えば、

CPU
 ↓
問題なし

Memory
 ↓
不足

Disk I/O
 ↓
高負荷

というケースもあります。

CPU使用率だけを見て原因を決めると、別の問題を見逃す可能性があります。

必要に応じて、

free -h

でメモリを確認したり、

iostat -xz 1

でディスクI/Oを確認したりしてください。

CPU負荷が高いときの確認コマンド

確認内容コマンド
CPU全体の状態top
CPU使用率順に表示ps aux --sort=-%cpu | head
特定プロセスの詳細ps -p PID -o pid,ppid,user,%cpu,%mem,etime,cmd
Dockerの負荷docker stats
メモリ確認free -h
ディスクI/O確認iostat -xz 1
cron確認crontab -l
rootのcron確認sudo crontab -l
サービス確認sudo systemctl status サービス名

CPU負荷が高いときの注意点

CPU使用率だけで原因を決めない

CPU使用率が高くても、正常な処理によって一時的に負荷が上がっている可能性があります。

バックアップやバッチ処理など、予定された処理であれば必ずしも異常とは限りません。

いきなりkillしない

CPUを大量に使っているプロセスを見つけても、すぐに終了させるのは避けましょう。

重要なサービスやデータベースを停止すると、別の障害につながる可能性があります。

まずプロセスの正体と実行目的を確認してください。

CPUコア数も確認する

CPU使用率の見え方は、CPUコア数によっても異なります。

サーバーのCPU情報を確認する場合は、

nproc

でCPUの論理プロセッサ数を確認できます。

lscpuを使えば、さらに詳しいCPU情報を確認できます。

lscpu

まとめ

LinuxサーバーのCPU使用率が高いときは、まずどのプロセスがCPUを消費しているのかを確認することが重要です。

最初にtopやpsでCPU負荷の高いプロセスを特定し、その後にアプリケーション、Docker、cron、データベースなどの原因を調べます。

また、サーバーが重い原因はCPUだけとは限りません。

メモリ不足やディスクI/Oが原因になっている場合もあるため、必要に応じてfreeやiostatなども確認してください。

原因を確認せずにプロセスを終了するのではなく、いつから負荷が高くなったのか、どのプロセスが原因なのか、正常な処理なのかを順番に切り分けることが大切です。

LinuxでCPU使用率を確認するにはどうすればいいですか?

topコマンドを使うと、CPU使用率やプロセスの状態をリアルタイムで確認できます。

CPU使用率の高いプロセスを一覧で確認したい場合は、ps aux --sort=-%cpu | headも便利です。

CPU使用率が100%になるのは異常ですか?

必ずしも異常とは限りません。

CPUを集中的に使用する処理が正常に実行されている場合もあります。ただし、サーバーの応答が遅いなどの問題が同時に発生している場合は、原因を確認する必要があります。

CPU使用率が高いプロセスをkillしてもいいですか?

重要なサービスやデータベースなどの可能性があるため、プロセスの正体を確認せずに終了するのは避けたほうが安全です。

まずPIDや実行コマンド、親プロセス、サービスの状態などを確認してください。

CPU使用率が低いのにサーバーが重いのはなぜですか?

メモリ不足やディスクI/O、ネットワーク、アプリケーション側の処理など、CPU以外に原因がある可能性があります。

free -hやiostat -xz 1なども使って、複数の項目を確認してください。

Linuxサーバーが重い・遅いときの原因と確認方法|CPU・メモリ・ディスクを順番に調べる

Linuxサーバーのメモリ不足を確認する方法|free・topで原因を調べる手順

Linuxのポートが開いているか確認する方法|ss・nc・curlで接続障害を切り分ける

類似投稿