web-dev-qa-db-ja.com

Apacheメモリの問題

ですから、これはおそらく以前に尋ねられたことがあると思いますが、正しい情報を取得していることを確認したいと思います。

Debian5とApache2.2で360Linodeボックスを実行しています。私はすべてを自分でコンパイルしました(apt-getはありません)。時々(数週間に1回?)、私のサーバーはランダムに「クラッシュ」します。最大100%のCPU(実際には400%ですが、私が何を意味するかはご存知でしょう)を起動し、ボックスを渡します。 SSHで接続して問題を確認できず、サーバー自体が接続の受け入れを停止しました。それを修正する唯一の方法は、ボックスを再起動することでした。

最近、それは相対的な頻度で起こり始めました:24時間、12時間、10時間、8、6、4。ついに、私はそれが約2日前にロックする直前に垣間見ることができました。ディスクIOが上昇していて、RAMがほとんど残っていないことに気づきました!また、3-4で実行されているhttpdプロセスのボート負荷がありました%RAM。ボートの負荷とは、ps -efを実行すると、画面全体を占めることを意味します。上にスクロールすると、SSHクライアントのバッファー全体を占めます。

そこで、何かが適切に閉じられていないと考えて、コードを微調整しました。 PHPのメモリの問題を修正し、より詳細なエラーロギングをオンにして、一連のエラーを修正しましたが、ある程度は役に立ったようです。クラッシュは約24時間ごとに戻りました。

これは、メモリが少なすぎるために発生していると確信しており、受信したヒットの量がサーバーをスワップに追い込んでいます。スワップにヒットするリクエストが非常に多いため、ディスクIOが屋根を突き抜け、CPU使用率が屋根を突き抜けて、サーバーがロックします。

これを修正するために私がしたことは次のとおりです。調査を行ったところ、おそらくプリフォークを使用する必要があることがわかりました。設定を調べたところ、ServerLimitやMaxClientsなどが見つからなかったため、いくつかの「デフォルト」値を追加しましたが、サーバーは/ any /着信接続の受け入れを拒否しました。事実上、prefork値は、接続を遮断することにより、すべてのインバウンドhttpトラフィックをブロックしました(おそらく、私のサーバーがprefork?idkを処理できないためです)。

私の見方では、これらのApacheプロセスがすべてハングアップし、メモリリークが発生し続けたことを除いて、サーバーが「以前行っていた」ことは問題ありませんでした。 Apacheプロセスにタイムアウトを設定したり、プロセスの数に制限を設けたりする方法はありますか?最善の解決策がプリフォークを使用することであることはかなり馬鹿げているようです。もっと良い方法があると想像しなければなりません。

みんなありがとう

4
mattbasta

PHPはメモリを大量に消費し、特にスケーラブルではないという難しい方法を学んでいるようです。

いくつかの提案、順不同:

それでもメモリリークが疑われる場合は、MaxRequestsPerChildを非常に低い値に設定してください。

より多くのメモリを購入することを検討してください。360メガバイトは最近ではそれほど多くありません。

Psまたはtopを実行し、すべてが常にメモリに収まるようにMaxClientsを設定して、httpdプロセスの平均サイズを見つけてみてください。スワッピングは死のスパイラルであり、そのためにリクエストの処理が遅くなるほど、Apacheがフォークする必要のあるプロセスが増え、さらに多くのメモリを使用します。

PhpをApacheのモジュールとしてロードすると、スクリプトであれ静的ファイル(画像、css、.jsなど)であれ、リクエストごとに読み込まれます。別のサーバーから静的コンテンツを提供するか、fastcgiまたはnginxなどのリバースプロキシを使用して、Apacheにphpのみを提供させ、メモリに保持する必要のあるファットphpインスタンスの数を制限することを検討してください。

メモリが非常に少ない場合は、PHPを使用してlighttpdやnginxなどをfastcgiプロセスとして実行してみてください。nginxはあまり使用していませんが、lighttpdの割り当てを使用しており、メモリ/ CPUのオーバーヘッドが非常に低くなっています。

fastcgiチュートリアルによるlighttpdとphp

0
sleepyjames

あなたのマシンはメモリ不足でスラッシングしていると思います。私の経験では、実行中のすべてのApacheプロセスには、大量のメモリを消費する可能性があります。 Apacheでモジュールとしてphpを実行している場合は、php.iniでmemory_limit =の値を確認してください。私は128Mを持っていましたが、これは10個のApacheプロセスしか実行していない場合はかなり多くなります。最初からその量をとらないかもしれませんが、PHPアプリケーションがメモリをリークするか、実際に128Mが必要な場合は、サーバーの制限に簡単に達することができます。

私の推奨事項は次のとおりです。物理RAMをmemory_limitで割るとmax_procsになります

0
lepole

接続しているデータベースバックエンドはありますか?多くの場合、一部のクエリの速度が低下し始めると、Apacheプロセスのバックアップが開始され、linodeのRAMの量が少ないと、雪だるま式になり、転倒して、 CPUと負荷を起動します。

もう1つ、ワーカーモデルを使用しているとおっしゃいました。 PHP内で使用しているすべてのモジュールがスレッドセーフであると100%確信している場合、これは問題ありません。実際のphpインストールマニュアルでは使用しないことをお勧めします( php manual ) ...使用するモデルに関係なく、適切に調整する必要があります。適切な開始点は LAMPシステムの調整 です。MaxClientsが適切に調整されていない場合、Apacheが原因でサイトへのトラフィックのバースト中にすべてのメモリを消費するため、システムがクラッシュします。

0
jlintz