web-dev-qa-db-ja.com

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

特にWordpressのような肥大化したアプリケーションでは、サーバーのメモリ割り当て制限に達することがありますが、「プールにメモリを割り当てることができません」、情報の追跡に問題が発生することはありません。

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

131
jonathanatx

おそらく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
89
Frankie

TTLを0にすると、APCがメモリ不足になるとall the cacheをフラッシュします。エラーは表示されなくなりましたが、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ファイルがキャッシュされないようにします。

ただし、0のTTLは使用しないでください。

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

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

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

123
bokan

私のための解決策:

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

編集開始

警告!

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

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

ttlを下げるとは、キャッシュをいっぱいにすることはできず、交換できないアイテムのみが含まれることを意味します。

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

私の場合、私は1GBのキャッシュサイズを持っていたので、それは私にとって十分以上でした。

編集終了

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

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

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

それが役立つことを願って

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

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

36
c33s

Apc.phpスクリプトを実行することは、問題が何であるかを理解するための鍵です、IMO。これにより、キャッシュのサイズを適切に設定することができました。現時点では、問題は解決しているようです。

6
Brice D

私のような初心者の場合、次のリソースが役立ちました。

上記の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

4
Brideau

Bokanが述べたように、使用可能な場合はメモリを増やすことができ、TTLを0に設定すると、生産性が逆になります。

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

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

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

特定のファイルが変更されたかどうかを確認するように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);
}
4
Jase Whatson

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

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

apc.shm_size = 128M

2
Peter Drinnan

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

参照: http://au1.php.net/manual/en/apc.configuration.php Bokanのコメントも読んでください。とても役に立ちました。

1
andrew

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

1
Bialy7

インターネットを見ると、さまざまな原因が考えられます。私の場合、...

apc.shm_size = 64M

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

1
Leo

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
Brent Self

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

これにより問題が解決します。

0
lazcorp