web-dev-qa-db-ja.com

PHP一定時間後のメモリ自動解放

顧客にサービスを提供するためにPHPアプリケーションを実行しているWebサーバーがあります。

  • PHP 4
  • 3GBのメモリ
  • Centos
  • ApacheHTTPサーバー。

お客様の負荷が増大するにつれて、サーバーのメモリの問題が発生しています。遅かれ早かれ、メモリを解放するためにHTTPサービスを再起動する必要があります(おそらく1日に5回)。

top から、ほとんどのHTTPプロセスは問題なく、わずかなメモリしか使用していないことがわかりますが、メモリの80%を使用し、CPU使用率がほぼゼロのHTTPプロセスが約3〜4個あります。デッドプロセスのように見えますが、HTTPサービスを再起動するまでメモリを解放しません。

PHPコードがうまく機能せず、大量のメモリを使用しているため、そこにぶら下がっていると思われます。PHP設定できる場所はありますか?これにより、プロセスが終了し、たとえば5分間アイドル状態になるとメモリが解放されますか?これは短期的な解決策ですが、これを実行しているコードを見つける必要がありますが、見つけるのは困難です。

3
starchx

php.iniファイルには関連する数行があります。 1つは、任意のphpスクリプトが通過できるRAM)を定義するmemory_limitであり、もう1つは、強制終了されるまでに取得するCPU時間を定義するmax_execution_timeです。後者に注意してください。時間はクロック時間ではなくCPU時間に基づいているため、CPUを使用していない場合は、合計されない可能性があります。

また、ご指摘のとおり、これらはアプリの誤動作を軽減するための一時的なハッキングであり、実際の修正ではありません。 straceは、メモリを大量に消費するプロセスが何をしているのかを正確に把握するのに役立つ場合があります。

2
Caleb

Apacheには MaxRequestsPerChild ディレクティブがあり、特定の数のリクエストが処理された後、ワーカー(mod_phpを埋め込むプロセス)をリサイクルするように指示できます。

3
crb

Linuxでは、「キャッシュされた」メモリはファイルのキャッシュに使用される空きメモリです。 Linuxは、ブロックデバイスでioを高速化するために、可能な限り多くのメモリを使用します。プログラムに実メモリが必要な場合、Linuxはスワップする前にキャッシュページを解放します。

たとえば、現在私のラップトップでは、メモリの90%が使用されていますが、スワップの0%が使用されています。これは、実際に使用されるメモリが20%しかないためです。

Topは、バッファに割り当てられるメモリの量を示します。この数が大きい場合、これは、使用済みメモリがキャッシュ専用であり、実際の使用済みメモリではないことを意味します。日中、スワップするメモリの量を確認できます(実際の問​​題)。

コマンド「free」を使用すると、実際に使用されているメモリを含む「-/ + buffers/cache」という行があります。

/ proc/sys/vm/swappinessについて読んで、スワップまたはファイルのキャッシュに使用するメモリの量を制御できます。

2
Javier Loureiro