このガイドでは、仮想サーバーにかかる高負荷の主な原因とその対処方法を解説します。
例えば、サーバーにホストされているサイトを開いた際に大きな遅延が発生したり、コンソールでコマンドが遅く実行される場合があります。
1. 負荷の確認
例えば、CPUが6コアの場合、最大負荷 (LA - Load Average) は6に相当します。(1は1コアに対する100%の負荷を表します。)
この例では、負荷を確認するために以下のコマンドを使用します。
top
スクリーンショットで確認できるように、この値が大幅に超えているため、仮想マシンに非常に高い負荷がかかっていることがわかります。
このように、サーバーが遅くなっている原因は、負荷が大幅に超えていることです。この例では、負荷をかけているプロセスが「R」(Run - 実行中のプロセス)状態になっていることも確認できます。
COMMANDの列では、最も多くのリソースを消費しているコマンドが表示されます。この例では、PHPスクリプトが原因となっています。
また、Tasksパラメータにも注目してください。これは仮想マシン上のプロセス数を示しており、合計で752のプロセスが実行されており、そのうち40がアクティブ状態にあります。
例えば、1日700人のユニーク訪問者と月に約21,000人の訪問者があるサイトの標準的な稼働状態では、同様のサーバー構成で負荷は次のようになります:LA - 0.41、Tasks - 51(2つが実行中)。
この状況から、サーバーがフラッド攻撃やDOS攻撃を受けているか、スクリプトがスパムの送信に使用されている可能性、あるいはサーバーが悪意あるユーザーによってプロキシとして利用されている可能性が高いです。
2. 解決策
高負荷の状態ではコンソールでの操作が難しいことがあります。今回の場合、これはWebサービスが原因です。まず、それらを停止します。
service nginx stop
service apache2 stop
場合によっては、これらのコマンドが実行に時間がかかることがあります。その場合は、プロセスを強制的に終了するのが良いでしょう。
アクティブなプロセスのpidを確認し、以下のコマンドを使用して終了します。(pidはプロセスIDです)
kill -9 pid
もし「top」コマンドが実行に時間がかかったり、動作が遅い場合は、ps auxコマンドを使用してプロセス名でフィルタリングします。
ps aux | grep nginx
これらのプロセスを終了させた後、負荷は正常に戻るはずです。その後、access logファイルを確認して同じリクエストがないか確認し、スクリプトへのパスを確認します。例えば、tailコマンドとgrepフィルタを使用します。
tail -f /var/log/nginx /access.log
注意!ログファイルのパスや名前は異なる可能性があります。
次に、悪意のあるスクリプトを削除します。これらのスクリプトは、他のファイルと比べて作成日が異なることが多いです。これはファイルマネージャーmcを使用して確認できます。
2.1 高負荷を引き起こしているスクリプトの別の検索方法
サーバーがコマンドに対して少し遅れて応答する場合(許容範囲内)、次のコマンドを使用してスクリプトファイル名を確認することができます。(pidはPHPプロセスのIDです)
lsof -p pid
悪意のあるファイルを削除すると、サーバーの負荷は徐々に軽減されます。
悪意のあるファイルが必ず存在するわけではなく、DOSやDDOS攻撃の場合もあります。その際は、セキュリティ対策が必要です。詳細はここで説明しています:フラッド攻撃からWebサーバーを守る方法
この例は、特に人気のあるCMSを使用している場合や、長期間更新されていない場合に起こりやすいです。