特にWordpressなどの肥大化したアプリケーションで、サーバーのメモリ割り当て制限に時々遭遇したことがありますが、「プールにメモリを割り当てられません」に遭遇したことがなく、情報を追跡できませんでした。
これが何を意味するのか誰か知っていますか?memory_limit
成功せずにを増やしてみました。また、アプリケーションに大きな変更を加えていません。ある日問題はありませんでしたが、翌日このエラーが発生しました。
特にWordpressなどの肥大化したアプリケーションで、サーバーのメモリ割り当て制限に時々遭遇したことがありますが、「プールにメモリを割り当てられません」に遭遇したことがなく、情報を追跡できませんでした。
これが何を意味するのか誰か知っていますか?memory_limit
成功せずにを増やしてみました。また、アプリケーションに大きな変更を加えていません。ある日問題はありませんでしたが、翌日このエラーが発生しました。
回答:
この問題を抱えている人々のために、.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
file_mask
これらの値のいずれでもない場合、エラーは発生しますか?これらの値の1つがあり、エラーが発生した場合、別の値に切り替える必要がありますか?どれ?
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サイトがある場合。キャッシュから除外します。
編集開始
@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を実行すると、キャッシュの使用状況がどのように見えるかを示す図が表示されます。
apc.phpスクリプトを実行することは、IMOの問題を理解する上で重要です。これはキャッシュのサイズを適切に設定するのに役立ち、現時点では問題を解決しているようです。
私のような初心者にとって、これらのリソースは役に立ちました:
上記の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
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);
}
これは私たちにとってはうまくいきました(同じサーバー上で多数のWordpressサイトを実行しています)。
/etc/php.d/apc.iniファイルのメモリ設定を変更しました。64Mに設定されていたため、128Mに倍増しました。
apc.shm_size = 128M
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プログラムを使用してファイルのアクセス許可を変更するか、ホスティングプロバイダーに連絡する必要がありますか?
私のシステムでは、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のコメントを読み、それらは非常に役に立ちました