php-cgi のメモリ使用量が php のメモリ制限を超えています

php-cgi のメモリ使用量が php のメモリ制限を超えています

私はワーカー MPM で Apache を実行し、fastcgi で PHP を実行しています。

私の MPM 制限は次のとおりです。

StartServers         5
MinSpareThreads      5
MaxSpareThreads      10
ThreadLimit          64
ThreadsPerChild      10
MaxClients           10
MaxRequestsPerChild  2000

また、php-cgi を次のように設定しました。

PHP_FCGI_CHILDREN=5
PHP_FCGI_MAX_REQUESTS=500

私の平均的な php-cgi プロセスは、起動直後から 200 MB 以上の RAM を使用していることに気づきました。ただし、私の php の memory_limit は 128 MB しかありません。

これはどうして可能なのでしょうか? また、php-cgi のメモリ消費量を減らすにはどうすればよいのでしょうか?

答え1

PHP が設定されたメモリ制限 (拡張機能で直接 malloc されたメモリ) を超える場合がありますが、そうではない可能性もあると思います。

私の平均的なphp-cgiプロセスは約200MB以上を使用していることに気づきました

これをどうやって測定したのですか? TXT セグメントのほとんどは共有されるため、実際のメモリ使用量は /proc ファイルシステムや ps/top に表示される量よりもはるかに少なくなります。lsof の出力を解析することもできますが、実際には、少し戻って進行中のリクエストの数 (たとえば、接続されているソケットの数) を確認し、これを報告された空きメモリ (バッファ/キャッシュが少ない) と比較する方がはるかに合理的だと思います。

答え2

PHP のメモリ制限は内部メモリ制限です。つまり、エンジンがユーザー スクリプトにプライベート アロケータを介して割り当てることを許可する量です。ただし、それ以外に、エンジンの内部ニーズのために割り当てられるメモリがあり、これは必ずしも制限にカウントされるわけではありません (一部はカウントされますが、すべてではありません)。また、ライブラリによって割り当てられるメモリもあります。そのため、実際のメモリ使用量はmemory_limit設定よりもわずかに大きくなると予想されます。

また、前述のように、ツールによって報告される数値の一部は、コード、スタック、OS I/O バッファ、ライブラリ間の共有メモリなどに割り当てられたメモリであるため、どの数値をチェックしているかを詳しく調べてください。

関連情報