「サイトが激重で全然開かない…」
「CPU使用率がずっと100%で張り付いてる」
「このままだとサーバーが落ちるかも!」
WebサーバーのCPU使用率100%は、まさに緊急事態です。
でも慌てないでください。
この記事では、今すぐできる応急処置から、二度と起こさないための根本対策まで、すべて解説します。読み終わる頃には、サーバーの負荷を自在にコントロールできるようになりますよ!
今すぐ確認!CPU100%の5大原因

1. アクセス急増(全体の40%)
【よくあるパターン】
- SNSでバズった
- テレビで紹介された
- 悪意のあるDDoS攻撃
- クローラーの大量アクセス
2. プログラムの無限ループ(25%)
【典型的な症状】
- 特定のプロセスがCPUを独占
- PHPやPythonのスクリプトが終わらない
- データベースクエリが永遠に実行中
3. メモリ不足によるスワップ(20%)
【メモリとCPUの関係】
- メモリが足りない → ディスクを仮想メモリとして使用
- ディスクアクセスでCPU負荷が上昇
- 悪循環に陥る
4. 設定ミス・非効率な設定(10%)
【見落としがちな設定】
- Apacheの MaxClients が大きすぎる
- PHPのメモリ制限が不適切
- キャッシュが無効になっている
5. マルウェア・不正アクセス(5%)
【危険な兆候】
- 見覚えのないプロセス
- 仮想通貨マイニングされている
- バックドアからの攻撃
緊急対処法:5分でCPU負荷を下げる

ステップ1:原因プロセスの特定(1分)
【Linuxの場合】
# CPU使用率の高いプロセスを表示
top
# または
htop
# より詳細な情報
ps aux | sort -nrk 3,3 | head -10
【見るべきポイント】
- %CPU列が高いプロセス
- TIMEが異常に長いプロセス
- プロセス名(httpd、php-fpm、mysql等)
ステップ2:不要なプロセスを停止(2分)
【安全に停止する順番】
# 1. まず該当プロセスを特定
ps aux | grep [プロセス名]
# 2. 穏やかに停止を依頼
kill -TERM [PID]
# 3. それでも止まらない場合
kill -KILL [PID]
【注意】 データベースプロセスは慎重に!データ破損のリスクがあります。
ステップ3:Webサーバーの再起動(2分)
【Apache の場合】
# 設定をチェック
apachectl configtest
# 問題なければ再起動
systemctl restart apache2
# または
service httpd restart
【Nginx の場合】
# 設定チェック
nginx -t
# 再起動
systemctl restart nginx
負荷の原因を詳しく調査

アクセスログの分析
【大量アクセスの発見方法】
# 最も多くアクセスしているIPアドレス TOP10
cat /var/log/apache2/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10
# 特定時間帯のアクセス数
grep "12/Sep/2024:14" /var/log/apache2/access.log | wc -l
# ボットのアクセスを確認
grep -i "bot\|crawler\|spider" /var/log/apache2/access.log | wc -l
プロセスごとのCPU使用率詳細
【便利なコマンド集】
# CPU使用率の履歴を見る
sar -u 1 10
# プロセスごとの詳細
pidstat 1 5
# Apache/Nginxの接続数
ss -ant | grep :80 | wc -l
データベースの負荷確認
【MySQL/MariaDB】
-- 実行中のクエリを確認
SHOW PROCESSLIST;
-- 長時間実行されているクエリ
SELECT * FROM information_schema.processlist
WHERE TIME > 10 ORDER BY TIME DESC;
-- スロークエリログの有効化
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;
即効性のある対策:すぐに負荷を下げる方法
1. 静的コンテンツのキャッシュ設定
【Nginxでの設定例】
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
【効果】
- 画像やCSS/JSの再読み込みを削減
- CPU負荷を30〜50%削減可能
2. PHP-FPMのチューニング
【/etc/php/7.4/fpm/pool.d/www.conf】
; 最適な値の計算式
; プロセス数 = 総メモリ / 1プロセスあたりのメモリ使用量
pm = dynamic
pm.max_children = 50 ; 最大プロセス数
pm.start_servers = 10 ; 起動時のプロセス数
pm.min_spare_servers = 5 ; 最小待機プロセス
pm.max_spare_servers = 20 ; 最大待機プロセス
pm.max_requests = 500 ; リサイクルまでのリクエスト数
3. 不要なApacheモジュールを無効化
【確認と無効化】
# 有効なモジュール一覧
apache2ctl -M
# 不要なモジュールを無効化
a2dismod status
a2dismod autoindex
a2dismod negotiation
# 再起動
systemctl restart apache2
攻撃への対処:DDoS・ボット対策

特定IPアドレスのブロック
【iptablesでのブロック】
# 特定IPをブロック
iptables -A INPUT -s 123.456.789.0 -j DROP
# 特定の国からのアクセスをブロック
iptables -A INPUT -m geoip --src-cc CN,RU -j DROP
# ルールの保存
iptables-save > /etc/iptables/rules.v4
fail2banの導入
【自動的に攻撃を検知・ブロック】
# インストール
apt-get install fail2ban
# 設定ファイル作成
cat > /etc/fail2ban/jail.local << EOF
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
[apache-badbots]
enabled = true
port = http,https
filter = apache-badbots
logpath = /var/log/apache2/access.log
maxretry = 2
[apache-overflows]
enabled = true
port = http,https
filter = apache-overflows
logpath = /var/log/apache2/error.log
maxretry = 2
EOF
# 起動
systemctl restart fail2ban
Cloudflareの活用
【無料でDDoS対策】
- Cloudflareアカウント作成
- DNSをCloudflareに変更
- セキュリティレベルを「高」に設定
- Rate Limitingを有効化
これだけで攻撃の70%以上を防げます!
データベースの最適化

インデックスの追加
【遅いクエリの特定と改善】
-- EXPLAINで実行計画を確認
EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';
-- インデックスを追加
CREATE INDEX idx_email ON users(email);
-- 複合インデックスの活用
CREATE INDEX idx_status_created ON posts(status, created_at);
クエリキャッシュの有効化
【my.cnf の設定】
[mysqld]
query_cache_type = 1
query_cache_size = 128M
query_cache_limit = 2M
# InnoDB の最適化
innodb_buffer_pool_size = 1G # 総メモリの50-70%
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2
不要なデータの削除
-- 古いログを削除
DELETE FROM logs WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY);
-- テーブルの最適化
OPTIMIZE TABLE logs;
監視とアラート設定
無料の監視ツール
【Zabbix のインストール】
# インストール
wget https://repo.zabbix.com/zabbix/6.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.0-1+ubuntu20.04_all.deb
dpkg -i zabbix-release_6.0-1+ubuntu20.04_all.deb
apt update
apt install zabbix-server-mysql zabbix-frontend-php zabbix-apache-conf zabbix-agent
【監視項目】
- CPU使用率
- メモリ使用率
- ディスクI/O
- ネットワークトラフィック
- HTTPレスポンス時間
シンプルな監視スクリプト
【CPU監視と自動通知】
#!/bin/bash
# cpu_monitor.sh
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
THRESHOLD=80
if (( $(echo "$CPU_USAGE > $THRESHOLD" | bc -l) )); then
echo "警告: CPU使用率が${CPU_USAGE}%です" | mail -s "CPU高負荷警告" admin@example.com
# 自動対処
systemctl restart php7.4-fpm
fi
【crontabに登録】
# 5分ごとに実行
*/5 * * * * /usr/local/bin/cpu_monitor.sh
予防策:二度と100%にしないために

1. オートスケーリングの設定
【AWS Auto Scaling】
- CPU使用率70%で自動的にサーバー追加
- 負荷が下がったら自動的に削減
- コストを最適化
2. CDNの活用
【CloudflareやAmazon CloudFront】
- 静的ファイルをキャッシュ
- 世界中のエッジサーバーから配信
- オリジンサーバーの負荷を80%削減
3. 定期的なパフォーマンステスト
【Apache Benchでの負荷テスト】
# 同時接続100、総リクエスト1000
ab -n 1000 -c 100 http://example.com/
# 結果の見方
# Requests per second: 処理能力
# Time per request: レスポンス時間
# Failed requests: エラー数
4. リソースの適切なサイジング
【必要スペックの目安】
- 小規模サイト(月間10万PV)
- CPU: 2コア
- メモリ: 4GB
- 同時接続: 50
- 中規模サイト(月間100万PV)
- CPU: 4コア
- メモリ: 8GB
- 同時接続: 200
- 大規模サイト(月間1000万PV以上)
- CPU: 8コア以上
- メモリ: 16GB以上
- ロードバランサー必須
まとめ:CPU 100%を恐れない運用を
WebサーバーのCPU使用率100%問題、これで完全に対処できますね!
【緊急時の対処手順】
- 原因特定(1分)
- topコマンドで確認
- アクセスログチェック
- 応急処置(5分)
- 問題プロセスの停止
- サービス再起動
- 根本対策(30分〜)
- キャッシュ設定
- チューニング
- 攻撃対策
【今すぐやるべきこと】
- 監視ツールの導入
- アラート設定
- 定期的な負荷テスト
CPU使用率100%は確かに緊急事態ですが、適切に対処すれば必ず解決できます。
この記事の方法を実践すれば、安定したWebサービス運用が実現できます。さあ、今すぐサーバーの健康診断を始めましょう!
コメント