WebサーバーのCPU使用率が100%!緊急対処法から根本解決まで完全ガイド

Web

「サイトが激重で全然開かない…」
「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対策】

  1. Cloudflareアカウント作成
  2. DNSをCloudflareに変更
  3. セキュリティレベルを「高」に設定
  4. 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. 原因特定(1分)
    • topコマンドで確認
    • アクセスログチェック
  2. 応急処置(5分)
    • 問題プロセスの停止
    • サービス再起動
  3. 根本対策(30分〜)
    • キャッシュ設定
    • チューニング
    • 攻撃対策

【今すぐやるべきこと】

  • 監視ツールの導入
  • アラート設定
  • 定期的な負荷テスト

CPU使用率100%は確かに緊急事態ですが、適切に対処すれば必ず解決できます。

この記事の方法を実践すれば、安定したWebサービス運用が実現できます。さあ、今すぐサーバーの健康診断を始めましょう!

コメント

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