9

これらのコンポーネントを使用する PHP アプリケーションがあります。

  • Centos 5.4 上の Apache 2.2.3-31
  • PHP 5.2.10
  • リモートデバッグが有効になっている Xdebug 2.0.5
  • APC 3.0.19
  • Doctrine ORM for PHP 1.2.1 クエリキャッシングと APC 経由の結果キャッシングを使用
  • クエリ キャッシングを使用する MySQL 5.0.77

Apache を起動すると、最終的に 10 個の子プロセスが作成されることに気付きました。時間が経つにつれて、各プロセスは使用可能なメモリの 10% に近づくまでメモリ内で増加します。これにより、サーバーが低速になり始め、メモリの 100% を占有するようになるためです。

これが私のトップ出力のスナップショットです。

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 1471 apache    16   0  626m 201m  18m S  0.0 10.2   1:11.02 httpd                                                                                                                                                          
 1470 apache    16   0  622m 198m  18m S  0.0 10.1   1:14.49 httpd                                                                                                                                                          
 1469 apache    16   0  619m 197m  18m S  0.0 10.0   1:11.98 httpd                                                                                                                                                          
 1462 apache    18   0  622m 197m  18m S  0.0 10.0   1:11.27 httpd                                                                                                                                                          
 1460 apache    15   0  622m 195m  18m S  0.0 10.0   1:12.73 httpd                                                                                                                                                          
 1459 apache    16   0  618m 191m  18m S  0.0  9.7   1:13.00 httpd                                                                                                                                                          
 1461 apache    18   0  616m 190m  18m S  0.0  9.7   1:14.09 httpd                                                                                                                                                          
 1468 apache    18   0  613m 190m  18m S  0.0  9.7   1:12.67 httpd                                                                                                                                                          
 7919 apache    18   0  116m  75m  15m S  0.0  3.8   0:19.86 httpd                                                                                                                                                          
 9486 apache    16   0 97.7m  56m  14m S  0.0  2.9   0:13.51 httpd 

実行時間の長いスクリプトはありません (最終的にはすべて終了し、最長でもおそらく 2 分かかります)。各スクリプトが終了すると、スクリプトが使用するメモリの割り当てが解除されるという前提で作業しています。(多分誰かがそれについて私を修正することができます)。

私の推測では、APC はリクエスト間のデータを保存するため、APC である可能性がありますが、同時に、httpd プロセス内にデータを保存するのは奇妙に思えます。

アプリのどの部分がメモリ リークを引き起こしているかを追跡するにはどうすればよいですか?

httpd プロセス内でメモリ使用量がどのように増加しているか、およびその原因を確認するには、どのツールを使用できますか?

4

1 に答える 1

2

私の勘では、リクエスト間でデータを保存するため、APCである可能性がありますが、同時に、httpdプロセス内にデータを保存するのは奇妙に思えます。

何がおかしいの?それはまさにAPCが行うことです。ただし、メモリはすべてのhttpdプロセス間で共有されるため、思ったほど悪くはありません。APCがオペコードとユーザー変数キャッシュをどこに保存するかを参照してください。詳細については。

于 2011-12-14T05:57:20.723 に答える