web-dev-qa-db-ja.com

ApacheがVPSをクラッシュさせる-メモリ使用量を減らす必要がある

Apacheを使用して提供されるWebアプリケーションを実行しているVPSがあり、平均して1秒あたり20〜50のリクエストを処理します。通常、Apacheが使用するメモリの量がVPSに対して多すぎてエラーが発生し始めるのは、このポイント(1秒あたり50リクエスト)を超えています。Webページがクラッシュし、VPSが1〜2分間フォールオーバーしてから、通常のレベルに戻ります。

MaxClientsはApacheが使用するRAM)の量を減らすための最良の方法であると信じており、MaxClientsを256(デフォルト値)から約100に減らすことを計画しています。各Apacheプロセスは約15MBを使用します。サーバーには合計1900MBのRAMがあります。サーバーはApacheといくつかのcronを実行する以外に何もしません。

現在の設定は次のとおりです。

KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 3

# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  4000
</IfModule>

MaxClientsを減らしてみましたが、その前に大幅な速度低下が発生したため、他のオプションも必要です。

MaxClientsを最大100に減らすという私の提案は理にかなっているように思われますか?サーバーで再び速度が低下した場合のオプションは何ですか?アプリケーションを最適化しますか?メモリ使用量を減らすための最良の方法は何ですか?画像を別のWebサーバーに移動しますか?

どんな提案もありがたく受けました!

3
Rhodri

Apacheのメモリ使用量を削減するための最良の方法は、mod_phpからfastcgiのようなものに移動することです。 mod_phpのオーバーヘッドのため、各Apacheプロセスは15MB以上です(ほとんどの場合)。 phpリクエストをfastcgiに渡すと、Apacheの構成に応じて平均Apacheプロセスサイズが約1MB程度に減少します。

Phpはfastcgiを使用して一元化されているため、メモリ使用量がより効率的になり、システムで使用されるメモリの総量がわずかに減少するはずです。

もう1つのアプローチは、メモリ効率の高いhttpサーバーをApacheの前に配置し、静的コンテンツを直接サーバーにして、非静的リクエストをApacheにプロキシすることです。 Nginxはこれに最適です。

一時的な修正として、MaxRequestsPerChildを1000またはより積極的なものに減らすことも検討できます。 Apacheプロセスはリクエストを処理するときにサイズが大きくなる傾向があるため、プロセスを強制終了して新しいプロセスを生成することにより、サイズを制限します。

2
CarpeNoctem