PHPで「プールにメモリを割り当てられない」原因は何ですか?


133

特にWordpressなどの肥大化したアプリケーションで、サーバーのメモリ割り当て制限に時々遭遇したことがありますが、「プールにメモリを割り当てられません」に遭遇したことがなく、情報を追跡できませんでした。

これが何を意味するのか誰か知っていますか?memory_limit成功せずにを増やしてみました。また、アプリケーションに大きな変更を加えていません。ある日問題はありませんでしたが、翌日このエラーが発生しました。

回答:


90

おそらくAPC関連です。

この問題を抱えている人々のために、.ini設定を指定してください。具体的には、apc.mmap_file_mask設定。

ファイルベースのmmapの場合、次のように設定する必要があります。

apc.mmap_file_mask=/tmp/apc.XXXXXX

/ dev / zeroから直接mmapするには、次を使用します。

apc.mmap_file_mask=/dev/zero

POSIX準拠の共有メモリを使用するmmapの場合、次を使用します。

apc.mmap_file_mask=/apc.shm.XXXXXX

ありがとう!それはまさに私が探していたリンクです。ヘルプに感謝します!
jonathanatx 2010

2
リンクされたスレッドのコメントにも記載されているように、これらの変更によって問題が解決されないことを発見しました...
ジョナサンデイ


2
私の場合、エラーを取り除くために、ファイルベースからPOSIX準拠に変更する必要がありました。
Attila Fulop、2012

4
この答えが問題を解決する方法を理解するのに途方に暮れています。がfile_maskこれらの値のいずれでもない場合、エラーは発生しますか?これらの値の1つがあり、エラーが発生した場合、別の値に切り替える必要がありますか?どれ?
ジェフ

125

TTLを0に設定すると、APCがメモリ不足になったときにすべてのキャッシュがフラッシュされます。エラーは表示されなくなりますが、APCの効率が大幅に低下します。「仕事をしたくない」という決定は、リスクもトラブルもありません。APCはそのように使用するためのものではありません。最もアクセスされるページが期限切れにならないように、十分に高いTTLを選択する必要があります。最良の方法は、APCがキャッシュをフラッシュする必要がないように十分なメモリを提供することです。

マニュアルを読んでttlの使い方を理解するだけです:http : //www.php.net/manual/en/apc.configuration.php#ini.apc.ttl

解決策は、APCに割り当てられるメモリを増やすことです。これを行うには、apc.shm_sizeを増やします。

APCが共有セグメントメモリを使用するようにコンパイルされている場合、オペレーティングシステムによって制限されます。次のコマンドを入力して、各セグメントのシステム制限を確認します。

sysctl -a | grep -E "shmall|shmmax"

より多くのメモリを割り当てるには、apc.shm_segmentsパラメータを使用してセグメントの数を増やす必要があります。

APCがmmapメモリを使用している場合、制限はありません。メモリの容量は、同じオプションapc.shm_sizeによって定義されます。

サーバーに十分なメモリがない場合は、フィルターオプションを使用して、アクセス頻度の低いphpファイルがキャッシュされないようにします。

ただし、TTLを0にしないでください。

c33sが言ったように、apc.phpを使用して設定を確認します。apcパッケージからwebfolderにファイルをコピーし、ブラウザーにそれをポイントします。実際に割り当てられているものとその使用方法が表示されます。グラフは、更新のたびに完全に変化している場合、数時間後も安定している必要があります。それは、設定が間違っていることを意味します(APCがすべてをフラッシュしています)。APCが実際にセキュリティマージンとして使用するものよりも20%多いRAMを割り当て、定期的にチェックします。

32MBのみを許可するデフォルトは、途方もなく低いです。PHPはサーバーが64MBのときに設計され、ほとんどのスクリプトはページごとに1つのphpファイルを使用していました。最近のMagentoのようなソリューションでは、1万を超えるファイル(APCでは約60Mb)が必要です。ほとんどのPHPファイルが常にキャッシュされるように、十分なメモリを確保する必要があります。これは無駄ではありません。ファイルキャッシュに対応する生のphpを保持するよりも、opcodeをramに保持する方が効率的です。最近では、24 GBのメモリを備えた専用サーバーを月額$ 80で見つけることができるので、APCに数GBを割り当てることをためらわないでください。5Magentoストアと約40のワードプレスウェブサイトをホストするサーバーに24GBのうち2GBを置きました。APCは1.2GBを使用します。Magentoのインストールでは64MB、プラグインを含むWordpressでは40MBをカウントします。

また、同じサーバー上に開発用Webサイトがある場合。キャッシュから除外します。


2
この!私はWordpressを実行していますが、32Mでは不十分でした。最大64Mになり、現在はクリアです。apc.phpの人をチェックしてください!
Dave Drager 2012

いい答えだ!+1ありがとうございます。
コスタノス2013年

64Mに増やすには、apc.shm_size = 64Mではなくapc.shm_size = 64を追加する必要があります(ほとんどの例で、最後にMが付いていました)私のバージョンのapc(v3.1.3p1)では機能しませんでした
Patrick Forget

1
TTLよりも長くキャッシュにあるキャッシュファイルがたくさんあると想定しています。c33sには重要なポイントがあります。最近すべてにアクセスした場合(キャッシュの70%がいつでもアクセスできるようになっていて、頻繁に追加されるファイルが一度に大量に追加される大きなスパイクがある)と、エラーが発生します。 TTL秒間スローされます。キャッシュがいっぱいで、APCにこれらのエントリをクリアしてはならないと文句を言った。TTLが5時間ある場合、頻度の低いファイルの有効期限が切れるまで5時間分のエラーが発生します。
マシューコルブ2013年

@MatthewKolb:APCがメモリに保持できるよりも多くのファイルをキャッシュすることはできません。フィルターを使用して、頻繁にアクセスされないファイルがキャッシュされるのを防ぎます。
bokan 2014年

36

私のための解決策:

  • apc.ttl = 0
  • apc.shm_size =あなたが欲しいもの

編集開始

警告!

@bokanは、ここに警告を追加する必要があることを示しました。

ttlが0の場合、これはすべてのキャッシュされたアイテムをすぐにパージできることを意味します。したがって、2mbのような小さなキャッシュサイズと0のttlがある場合、キャッシュ内のデータは常に上書きされるため、apcは役に立たなくなります。

ttlを下げるということは、キャッシュがいっぱいにならないということだけを意味します。

したがって、ttlとキャッシュサイズの適切なバランスを選択する必要があります。

私の場合、キャッシュサイズは1GBだったので、それで十分です。

編集終了

centos 5とphp 5.2.17で同じ問題があり、キャッシュするphpファイルが大量にあるときに、キャッシュサイズが小さく、ttlパラメータが「7200」のように「高」である場合、キャッシュが非常に速くいっぱいになることに気付きました。キャッシュ内のすべてのファイルがまだttlに収まるため、apcは削除できるものを何も見つけません。

メモリサイズを増やすことは一部のソリューションにすぎません。キャッシュがいっぱいになり、すべてのファイルがttl内にある場合は、このエラーが発生します。

したがって、私の解決策はttlを0に設定することでした。そのため、apcはキャッシュをいっぱいにし、常にapcが新しいデータ用にメモリをクリアする可能性があります。

それが役に立てば幸い

編集:参照:http : //pecl.php.net/bugs/bug.php?id=16966

http://pecl.php.net/get/APC抽出をダウンロードしてapc.phpを実行すると、キャッシュの使用状況がどのように見えるかを示す図が表示されます。


2
ありがとう、これは助けになりました。1秒あたり約12個の「メモリを割り当てられません」エラーが発生していました。キャッシュサイズを2倍にして(32〜64 MB)、TTLを0に落としました。これにより、これらのエラーは完全に削除されました。
素晴しい

1
これはサーバーでの修正でした。
ジャスティン

1
これで問題も解決したようです。
アニソプテラ2011年

1
ZWAMPを使用することで、これで問題が解決したようです。ありがとう。
WernerCD、2011

10
これは解決策ではありません!エラーは消えますが、APCはほぼ無効になります。メモリがいっぱいになるたびにすべてのキャッシュをフラッシュします。Brideauから提供されたマニュアルを読んでください。php.net/manual/en/apc.configuration.php#ini.apc.ttl。
bokan 2012

7

apc.phpスクリプトを実行することは、IMOの問題を理解する上で重要です。これはキャッシュのサイズを適切に設定するのに役立ち、現時点では問題を解決しているようです。


1
c33sが言ったように:ダウンロードpecl.php.net/get/APCのエキスをしてapc.phpを実行して、あなたは素敵な図が持っているかのようなあなたのキャッシュの使用状況を見て
タイムボカン

4

私のような初心者にとって、これらのリソースは役に立ちました:

上記のc33sで推奨されている変更を行うapc.iniファイルを見つけ、推奨量を設定する:http : //www.untwistedvortex.com/optimizing-tuning-apc-alternate-php-cache/

apc.ttlとは何かを理解する:http ://www.php.net/manual/en/apc.configuration.php#ini.apc.ttl

apc.shm_sizeの概要:http ://www.php.net/manual/en/apc.configuration.php#ini.apc.shm-size


ありがとう、あなたは正しい解決策を指摘しました。TTLを下げるのは、APCを無効にするのと同じです。
bokan 2012

4

Bokanが述べたように、可能な場合はメモリを増やすことができ、彼はTTLを0に設定することによる生産性の低下に正反対です。

注意:これは、特定の問題に対してこのエラーを修正した方法です。その一般的な問題は多くのことが原因で発生する可能性があるため、エラーが発生し、APCにロードされている重複するPHPファイルが原因であると考えられる場合にのみ、以下に従ってください。

私が抱えていた問題は、PHPアプリケーションの新しいバージョンをリリースしたときのことでした。つまり、すべての.phpファイルを新しいファイルに置き換えました。APCは両方のバージョンをキャッシュにロードします。

2つのバージョンのphpファイルを保存するのに十分なメモリがなかったため、APCでメモリが不足していました。

特定のファイルが変更されているかどうかを確認するようにAPCに指示するapc.statと呼ばれるオプションがあります。変更されている場合は、常に変更できますが、本番環境では通常はオフになっているため、これは通常開発で問題ありません。ケース-http://www.php.net/manual/en/apc.configuration.php#ini.apc.stat

パフォーマンスに問題がなければ、apc.statをオンにするとこの問題が解決します。

私の問題のために思いついた解決策は、プロジェクトのバージョンが変更されているかどうかを確認し、変更されている場合はキャッシュを空にしてページを再読み込みすることです。

define('PROJECT_VERSION', '0.28'); 

if(apc_exists('MY_APP_VERSION') ){

    if(apc_fetch('MY_APP_VERSION') != PROJECT_VERSION){
        apc_clear_cache();
        apc_store ('MY_APP_VERSION', PROJECT_VERSION);
        header('Location: ' . 'http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']);
        exit;  
    }

}else{
    apc_store ('MY_APP_VERSION', PROJECT_VERSION);
}

2

これは私たちにとってはうまくいきました(同じサーバー上で多数のWordpressサイトを実行しています)。

/etc/php.d/apc.iniファイルのメモリ設定を変更しました。64Mに設定されていたため、128Mに倍増しました。

apc.shm_size = 128M


1

インターネットを見ると、さまざまな原因が考えられます。私の場合、以外はすべてデフォルトのままにします...

apc.shm_size = 64M

...私が以前に得ていた無数の警告をクリアしました。


1

OpenCartインストールを別のサーバーに移動した後、「プールにメモリを割り当てることができません」というエラーを受け取りました。また、memory_limitを上げてみました。

エラーメッセージのファイルの権限を変更して、apacheを実行しているユーザー(apache、www-dataなど)による書き込みアクセスを許可した後、エラーが停止しました。/ etc / groupを直接変更する(またはファイルを0777にchmodする)代わりに、usermodを使用しました。

usermod -a -G vhost-user-group apache-user

次に、変更を有効にするためにApacheを再起動する必要がありました。

apachectl restart

または

sudo /etc/init.d/httpd restart

または、システムがApacheを再起動するために使用するもの。

サイトが共有ホスティング上にある場合、FTPプログラムを使用してファイルのアクセス許可を変更するか、ホスティングプロバイダーに連絡する必要がありますか?


1

この問題を解決するにはapc.shm_sizeの値を整数として設定しますapc.iniファイルを見つけ(私のシステムではapc.iniファイルの場所/etc/php5/conf.d/apc.ini)、次のように設定します: apc.shm_size = 1000


1

私のシステムでは、apc.shm_size = 64Mを/usr/local/etc/php.ini(FreeBSD 9.1)に挿入する必要があり、apc.php(/ usr / local / share / doc / APCからコピー)を見た/apc.phpから/ usr / local / www / apache24 / dataへ)キャッシュサイズがデフォルトの32Mから64Mに増加し、大量のキャッシュフルカウントを取得しなくなった

参照:http : //au1.php.net/manual/en/apc.configuration.php もBokanのコメントを読み、それらは非常に役に立ちました


0

キャッシュファイルサイズを監視し(apc peclパッケージのapc.phpを使用できます)、必要に応じてapc.shm_sizeを増やします。

これは問題を解決します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.