LinuxでCPU負荷を確認するコマンド|状況を素早く把握する便利ツールまとめ

Linux

サーバー運用や開発環境でLinuxを使っていると「なんだか動きが重い」「プロセスが詰まっている気がする」と感じることはありませんか?

そんなときにすぐ試したいのがCPU負荷(使用率)の確認です。

この記事では、LinuxでCPU負荷をチェックする代表的なコマンド、簡単にリアルタイム監視する方法、ちょっとした見方のポイントをわかりやすく解説します。

これを読めば、CPUが重い原因を素早く突き止められるようになりますよ!

スポンサーリンク

CPU負荷確認の基本知識

CPU負荷とは何か

主要な指標

指標説明単位正常範囲
CPU使用率CPUが処理中の時間の割合%80%以下
ロードアベレージ実行待ちプロセス数の平均数値CPUコア数以下
アイドル率CPUが待機している時間の割合%20%以上
I/O待機率ディスクI/O待ちの時間%10%以下

CPU使用率の内訳

主要な構成要素

  • us(user):ユーザープロセスによるCPU使用
  • sy(system):カーネル・システム処理による使用
  • ni(nice):低優先度プロセスによる使用
  • id(idle):アイドル状態(未使用)
  • wa(iowait):I/O完了待ちの時間
  • hi(hardware interrupts):ハードウェア割り込み処理
  • si(software interrupts):ソフトウェア割り込み処理
  • st(steal time):仮想化環境での待機時間

負荷の判断基準

健全な状態

CPU使用率

  • 0-30%:軽負荷、余裕のある状態
  • 30-70%:中負荷、正常な業務範囲
  • 70-90%:高負荷、注意が必要
  • 90-100%:過負荷、対策が必要

ロードアベレージ

  • 1分平均 < CPUコア数:正常
  • 5分平均 < CPUコア数:安定
  • 15分平均 < CPUコア数:長期的に安定

基本的なCPU負荷確認コマンド

top コマンド(定番ツール)

基本的な使い方

top

出力例

top - 14:30:15 up 5 days,  2:15,  2 users,  load average: 0.15, 0.18, 0.20
Tasks: 234 total,   1 running, 233 sleeping,   0 stopped,   0 zombie
%Cpu(s):  2.0 us,  0.5 sy,  0.0 ni, 97.2 id,  0.3 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   7936.2 total,   1234.5 free,   3456.7 used,   3245.0 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   4123.4 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
   1234 user      20   0  123456  12345   1234 S   5.6   0.2   1:23.45 python3
   5678 root      20   0   98765   9876    987 R   3.2   0.1   0:45.67 nginx

topコマンドの読み方

ヘッダー情報

  • load average:1分、5分、15分の平均負荷
  • Tasks:プロセス数の内訳
  • %Cpu(s):CPU使用率の詳細
  • Mem/Swap:メモリ使用状況

プロセス一覧

  • PID:プロセスID
  • %CPU:CPU使用率
  • %MEM:メモリ使用率
  • TIME+:累積CPU時間
  • COMMAND:実行コマンド

便利なオプションとキー操作

起動オプション

# 1秒間隔で更新
top -d 1

# 特定ユーザーのプロセスのみ表示
top -u username

# バッチモードで1回だけ実行
top -b -n 1

インタラクティブキー

  • 1:CPU毎の使用率表示
  • P:CPU使用率でソート
  • M:メモリ使用率でソート
  • T:累積時間でソート
  • k:プロセス終了
  • q:終了

htop コマンド(高機能版)

インストール方法

RHEL/CentOS/Fedora

sudo yum install htop     # RHEL/CentOS 7
sudo dnf install htop     # RHEL/CentOS 8以降

Ubuntu/Debian

sudo apt update
sudo apt install htop

htopの特徴と利点

視覚的な改善

  • カラフルなCPU/メモリ使用率バー
  • マウス操作対応
  • ツリー表示でプロセス階層が見やすい

機能的な改善

  • より直感的なキー操作
  • 列の並び替え機能
  • 検索機能の強化

基本的な使い方

htop

便利なキー操作

  • F1:ヘルプ表示
  • F2:設定画面
  • F3:プロセス検索
  • F4:フィルター
  • F5:ツリー表示切り替え
  • F6:ソート列選択
  • F9:プロセス終了
  • F10:終了

詳細なCPU統計情報

mpstat コマンド(sysstat パッケージ)

インストール方法

RHEL/CentOS/Fedora

sudo yum install sysstat
# または
sudo dnf install sysstat

Ubuntu/Debian

sudo apt install sysstat

基本的な使用方法

全CPU情報を1秒間隔で表示

mpstat 1

全CPUコア個別情報

mpstat -P ALL 1

出力例

Linux 5.4.0 (hostname)     03/15/24        _x86_64_        (4 CPU)

14:30:16     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
14:30:17     all    2.50    0.00    0.75    0.25    0.00    0.00    0.00    0.00    0.00   96.50
14:30:17       0    3.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   96.00
14:30:17       1    2.00    0.00    0.50    0.50    0.00    0.00    0.00    0.00    0.00   97.00
14:30:17       2    2.50    0.00    0.75    0.25    0.00    0.00    0.00    0.00    0.00   96.50
14:30:17       3    2.50    0.00    0.75    0.25    0.00    0.00    0.00    0.00    0.00   96.50

便利なオプション

指定回数だけ実行

mpstat 1 10  # 1秒間隔で10回実行

特定CPUのみ表示

mpstat -P 0,1 1  # CPU 0と1のみ

日時付きで保存

mpstat 5 > cpu_stats.log &  # バックグラウンドで5秒間隔で記録

vmstat コマンド(仮想メモリ統計)

基本的な使用方法

vmstat 1

出力例

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 1234567  123456 3456789    0    0     5    10  100  200  2  1 97  0  0
 0  0      0 1234567  123456 3456789    0    0     0     0   98  180  1  0 99  0  0

各列の意味

プロセス(procs)

  • r:実行待ちプロセス数
  • b:割り込み不可能なスリープ状態のプロセス数

CPU

  • us:ユーザー時間の割合
  • sy:システム時間の割合
  • id:アイドル時間の割合
  • wa:I/O待ち時間の割合
  • st:盗取時間(仮想化環境)

便利なオプション

ディスク統計も含める

vmstat -d 1

メモリ情報を詳細表示

vmstat -s

ロードアベレージの確認

uptime コマンド

基本的な使用方法

uptime

出力例

 14:30:15 up 5 days,  2:15,  2 users,  load average: 0.15, 0.18, 0.20

ロードアベレージの読み方

3つの数値の意味

  • 0.15:過去1分間の平均
  • 0.18:過去5分間の平均
  • 0.20:過去15分間の平均

判断基準

# CPUコア数を確認
nproc
# または
cat /proc/cpuinfo | grep processor | wc -l

4コアCPUの場合

  • 0.0-1.0:軽負荷
  • 1.0-2.0:中負荷
  • 2.0-3.0:高負荷
  • 3.0-4.0:満負荷
  • 4.0以上:過負荷(待ち行列発生)

w コマンド(ユーザー情報付き)

w

出力例

 14:30:15 up 5 days,  2:15,  2 users,  load average: 0.15, 0.18, 0.20
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
user1    pts/0    192.168.1.100    13:45    0.00s  0.25s  0.01s top
user2    pts/1    192.168.1.101    14:20    5:00   0.10s  0.10s -bash

特定プロセスのCPU使用率確認

ps コマンドでの確認

CPU使用率順にソート

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

出力例

USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
apache      1234  45.2  2.1 456789 12345 ?       S    13:45   5:23 httpd
mysql       5678  23.1  8.5 987654 67890 ?       Sl   10:30  12:45 mysqld
user        9012  12.3  1.2 234567  8901 pts/0   R+   14:25   0:12 python3 script.py

特定プロセス名での検索

ps aux | grep httpd | grep -v grep

リアルタイム監視

watch -n 1 'ps aux --sort=-%cpu | head -10'

pidstat コマンド(プロセス別詳細統計)

基本的な使用方法

pidstat 1

特定プロセスの監視

pidstat -p 1234 1  # PID 1234を1秒間隔で監視

コマンド名での監視

pidstat -C httpd 1  # httpdプロセスを監視

便利なオプション

I/O統計も含める

pidstat -d 1  # ディスクI/O統計

メモリ統計も含める

pidstat -r 1  # メモリ使用統計

全情報を表示

pidstat -u -r -d 1  # CPU、メモリ、ディスクすべて

高度な監視とトラブルシューティング

sar コマンド(システム活動レポート)

基本的な使用方法

CPU統計の記録

sar -u 1 60  # 1秒間隔で60回記録

過去のデータ表示

sar -u -f /var/log/sysstat/saXX  # XX は日付

便利な統計オプション

ロードアベレージ

sar -q 1

割り込み統計

sar -I ALL 1

コンテキストスイッチ

sar -w 1

iostat コマンド(I/O統計)

CPU統計と組み合わせ

iostat -x 1

CPU使用率とディスクI/Oの相関

iostat -c -d 1

nmon(Nigel’s Monitor)

インストールと使用

インストール

# RHEL/CentOS
sudo yum install nmon
# Ubuntu/Debian
sudo apt install nmon

使用方法

nmon

インタラクティブキー

  • c:CPU統計表示
  • m:メモリ統計表示
  • d:ディスク統計表示
  • n:ネットワーク統計表示

自動化とスクリプト化

CPU負荷監視スクリプト

基本的な監視スクリプト

#!/bin/bash
# cpu_monitor.sh

THRESHOLD=80
LOGFILE="/var/log/cpu_monitor.log"

while true; do
    # CPU使用率取得(アイドル率から計算)
    CPU_IDLE=$(top -bn1 | grep "Cpu(s)" | awk '{print $8}' | cut -d'%' -f1)
    CPU_USAGE=$(echo "100 - $CPU_IDLE" | bc)
    
    TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
    
    if (( $(echo "$CPU_USAGE > $THRESHOLD" | bc -l) )); then
        echo "$TIMESTAMP - WARNING: CPU使用率が ${CPU_USAGE}% です" | tee -a $LOGFILE
        
        # 上位プロセスをログに記録
        echo "$TIMESTAMP - Top CPU processes:" >> $LOGFILE
        ps aux --sort=-%cpu | head -5 >> $LOGFILE
    fi
    
    sleep 60  # 1分間隔
done

高負荷時の自動対応スクリプト

#!/bin/bash
# cpu_alert.sh

THRESHOLD=90
EMAIL="admin@example.com"

check_cpu_load() {
    local load_avg=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | sed 's/,//')
    local cpu_cores=$(nproc)
    local load_per_core=$(echo "scale=2; $load_avg / $cpu_cores" | bc)
    
    if (( $(echo "$load_per_core > 1.5" | bc -l) )); then
        return 1  # 高負荷
    else
        return 0  # 正常
    fi
}

if check_cpu_load; then
    echo "CPU負荷正常"
else
    # アラート送信
    {
        echo "サーバー: $(hostname)"
        echo "時刻: $(date)"
        echo "ロードアベレージ: $(uptime | awk -F'load average:' '{print $2}')"
        echo ""
        echo "上位CPUプロセス:"
        ps aux --sort=-%cpu | head -10
    } | mail -s "CPU高負荷アラート" $EMAIL
fi

cron での定期実行

crontab 設定例

# crontab -e で編集

# 5分毎にCPU負荷をチェック
*/5 * * * * /path/to/cpu_monitor.sh

# 1時間毎にCPU統計をログに記録
0 * * * * sar -u 1 1 >> /var/log/cpu_hourly.log

# 日次でCPU使用率レポート作成
0 6 * * * /path/to/daily_cpu_report.sh

パフォーマンスチューニング

CPU使用率が高い場合の対処法

原因の特定

1. プロセス特定

# CPU使用率TOP10
ps aux --sort=-%cpu | head -10

# 長時間実行中のプロセス
ps aux --sort=-time | head -10

2. スレッド別確認

# プロセス内のスレッド表示
top -H -p <PID>

# または
ps -eLf | grep <PID>

3. システムコール監視

# 特定プロセスのシステムコール監視
strace -p <PID> -c

対処方法

プロセス優先度調整

# nice値を変更(-20が最高、19が最低優先度)
renice 10 <PID>

# 新規プロセス起動時に優先度指定
nice -n 10 ./heavy_process

CPUアフィニティ設定

# 特定CPUコアに固定
taskset -cp 0,1 <PID>

# プロセス起動時にCPU指定
taskset -c 0,1 ./process

CPU負荷分散

マルチプロセス化

GNU parallel の活用

# 複数ファイルを並列処理
ls *.txt | parallel -j 4 process_file.sh

# CPU数に応じた並列度自動調整
parallel -j $(nproc) command ::: item1 item2 item3

プロセス分散

複数サーバーでの負荷分散

# SSH経由でリモートサーバーに処理分散
for server in server1 server2 server3; do
    ssh $server "nohup ./heavy_task.sh &"
done

トラブルシューティング実例

ケース1:突然CPU使用率が100%になった

調査手順

1. 現在の状況確認

top -c  # コマンド詳細表示
htop    # より見やすい表示

2. プロセス履歴確認

# プロセス開始時間順
ps aux --sort=start_time

# 累積CPU時間順
ps aux --sort=-time

3. ログ確認

# システムログ確認
journalctl -f
tail -f /var/log/messages

# プロセス固有ログ
tail -f /var/log/application.log

対処例

暴走プロセスの終了

# 段階的な終了
kill <PID>
kill -TERM <PID>
kill -KILL <PID>

# プロセス名での一括終了
pkill -f "problem_process"

ケース2:ロードアベレージが高いがCPU使用率は低い

原因調査

I/O待機の確認

# I/O統計確認
iostat -x 1

# プロセス別I/O確認
iotop

待機プロセス確認

# 状態別プロセス数
ps aux | awk '{print $8}' | sort | uniq -c

# D state(割り込み不可)プロセス確認
ps aux | grep " D "

まとめ

LinuxでのCPU負荷確認について、重要なポイントをまとめます:

基本的な確認コマンド

  • リアルタイム監視tophtop
  • 詳細統計mpstatvmstat
  • ロードアベレージuptimew
  • プロセス別ps aux --sort=-%cpupidstat

使い分けの指針

  • 簡単な確認topuptime
  • 詳細分析htopmpstat -P ALL
  • 自動監視sar、スクリプト化
  • トラブル時htop + ps + ログ確認

判断基準

  • CPU使用率:80%以下が理想
  • ロードアベレージ:CPUコア数以下
  • I/O待機:10%以下が理想
  • アイドル率:20%以上を維持

トラブル対応

  • 段階的調査:全体→プロセス→スレッド
  • ログ確認:システムログとアプリログ
  • 対処方法:プロセス終了、優先度調整、負荷分散

これらのコマンドと知識があれば、LinuxのCPU負荷を効率的に監視・管理できます。定期的な監視と適切な対処により、システムの安定性を保つことができます。

コメント

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