サーバー運用や開発環境で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負荷確認について、重要なポイントをまとめます:
基本的な確認コマンド
- リアルタイム監視:
top
、htop
- 詳細統計:
mpstat
、vmstat
- ロードアベレージ:
uptime
、w
- プロセス別:
ps aux --sort=-%cpu
、pidstat
使い分けの指針
- 簡単な確認:
top
、uptime
- 詳細分析:
htop
、mpstat -P ALL
- 自動監視:
sar
、スクリプト化 - トラブル時:
htop
+ps
+ ログ確認
判断基準
- CPU使用率:80%以下が理想
- ロードアベレージ:CPUコア数以下
- I/O待機:10%以下が理想
- アイドル率:20%以上を維持
トラブル対応
- 段階的調査:全体→プロセス→スレッド
- ログ確認:システムログとアプリログ
- 対処方法:プロセス終了、優先度調整、負荷分散
これらのコマンドと知識があれば、LinuxのCPU負荷を効率的に監視・管理できます。定期的な監視と適切な対処により、システムの安定性を保つことができます。
コメント