Ich bin gelegentlich auf das Speicherzuweisungslimit eines Servers gestoßen, insbesondere bei einer aufgeblähten Anwendung wie Wordpress, bin jedoch nie auf "Speicher für Pool kann nicht zugeordnet werden" gestoßen und habe Probleme beim Auffinden von Informationen.
Weiß jemand was das bedeutet? Ich habe versucht, die memory_limit
ohne Erfolg zu erhöhen . Ich habe auch keine wesentlichen Änderungen an der Anwendung vorgenommen. An einem Tag gab es kein Problem, am nächsten Tag traf ich diesen Fehler.
file_mask
nicht einer dieser Werte ist? Wenn ich einen dieser Werte habe und den Fehler erhalte, muss ich ihn auf einen anderen umstellen? Welcher?Die Verwendung einer TTL von 0 bedeutet, dass APC den gesamten Cache leert, wenn der Speicher knapp wird. Der Fehler tritt nicht mehr auf, macht APC jedoch weitaus weniger effizient. Es ist kein Risiko, kein Problem, die Entscheidung "Ich will meinen Job nicht machen". APC soll nicht so verwendet werden. Sie sollten eine TTL wählen, die hoch genug ist, damit die Seiten, auf die am häufigsten zugegriffen wird, nicht ablaufen. Am besten geben Sie genügend Speicherplatz, damit APC den Cache nicht leeren muss.
Lesen Sie einfach das Handbuch, um zu verstehen, wie ttl verwendet wird: http://www.php.net/manual/en/apc.configuration.php#ini.apc.ttl
Die Lösung besteht darin, den APC zugewiesenen Speicher zu erhöhen. Erhöhen Sie dazu apc.shm_size.
Wenn APC für die Verwendung von Shared Segment Memory kompiliert wird, sind Sie von Ihrem Betriebssystem eingeschränkt. Geben Sie diesen Befehl ein, um Ihr Systemlimit für jedes Segment anzuzeigen:
Um mehr Speicher zuzuweisen, müssen Sie die Anzahl der Segmente mit dem Parameter apc.shm_segments erhöhen.
Wenn APC mmap-Speicher verwendet, gibt es keine Begrenzung. Die Speichermenge wird weiterhin durch dieselbe Option apc.shm_size definiert.
Wenn auf dem Server nicht genügend Speicher vorhanden ist, verwenden Sie die Filteroption, um zu verhindern, dass weniger häufig aufgerufene PHP-Dateien zwischengespeichert werden.
Verwenden Sie jedoch niemals eine TTL von 0.
Verwenden Sie, wie c33s sagte, apc.php, um Ihre Konfiguration zu überprüfen. Kopieren Sie die Datei aus dem apc-Paket in einen Webordner und zeigen Sie mit dem Browser darauf. Sie werden sehen, was wirklich zugewiesen ist und wie es verwendet wird. Die Diagramme müssen nach Stunden stabil bleiben. Wenn sie sich bei jeder Aktualisierung vollständig ändern, bedeutet dies, dass Ihr Setup falsch ist (APC spült alles). Weisen Sie 20% mehr RAM zu, als APC tatsächlich als Sicherheitsmarge verwendet, und überprüfen Sie dies regelmäßig.
Die Standardeinstellung, nur 32 MB zuzulassen, ist lächerlich niedrig. PHP wurde entwickelt, wenn die Server 64 MB groß waren und die meisten Skripte eine PHP-Datei pro Seite verwendeten. Heutzutage erfordern Lösungen wie Magento mehr als 10.000 Dateien (~ 60 MB in APC). Sie sollten genügend Speicher zulassen, damit die meisten PHP-Dateien immer zwischengespeichert werden. Es ist keine Verschwendung, es ist effizienter, Opcode im RAM zu behalten, als das entsprechende Roh-PHP im Datei-Cache zu haben. Heutzutage finden wir dedizierte Server mit 24 GB Speicher für nur 80 US-Dollar pro Monat. Zögern Sie also nicht, mehrere GB für APC zuzulassen. Ich habe 2 von 24 GB auf einen Server mit 5Magento-Stores und ~ 40 WordPress-Websites gestellt. APC verwendet 1,2 GB. Zählen Sie 64 MB für die Magento-Installation, 40 MB für ein Wordpress mit einigen Plugins.
Auch wenn Sie Entwicklungswebsites auf demselben Server haben. Schließen Sie sie aus dem Cache aus.
quelle
Lösung für mich:
Start bearbeiten
Warnung!
@bokan hat mir mitgeteilt, dass ich hier eine Warnung hinzufügen soll.
Wenn Sie einen ttl von 0 haben, bedeutet dies, dass jedes zwischengespeicherte Element sofort gelöscht werden kann. Wenn Sie also eine kleine Cache-Größe wie 2 MB und eine ttl von 0 haben, würde dies die APC unbrauchbar machen, da die Daten im Cache immer überschrieben werden.
Das Verringern des ttl bedeutet nur, dass der Cache nicht voll werden kann, nur mit Elementen, die nicht ersetzt werden können.
Sie müssen also ein ausgewogenes Verhältnis zwischen ttl und Cache-Größe wählen.
In meinem Fall hatte ich eine Cache-Größe von 1 GB, also war es mehr als genug für mich.
Ende bearbeiten
hatte das gleiche Problem auf Centos 5 mit PHP 5.2.17 und bemerkte, dass wenn der Cache klein ist und der ttl-Parameter "hoch" ist (wie 7200), während viele PHP-Dateien zwischengespeichert werden müssen, der Cache ziemlich schnell voll wird und apc findet nichts, was es entfernen kann, weil alle Dateien im Cache noch in das ttl passen.
Das Erhöhen der Speichergröße ist nur eine Teillösung. Dieser Fehler tritt immer noch auf, wenn der Cache voll ist und sich alle Dateien im ttl befinden.
Meine Lösung bestand also darin, ttl auf 0 zu setzen, damit apc den Cache ausfüllt und apc immer die Möglichkeit hat, Speicher für neue Daten zu löschen.
hoffentlich hilft das
Bearbeiten: Siehe auch: http://pecl.php.net/bugs/bug.php?id=16966
Laden Sie den Extrakt http://pecl.php.net/get/APC herunter und führen Sie die Datei apc.php aus. Dort haben Sie ein schönes Diagramm, wie Ihre Cache-Nutzung aussieht
quelle
Das Ausführen des Skripts apc.php ist der Schlüssel zum Verständnis Ihres Problems, IMO. Dies hat uns geholfen, unseren Cache richtig zu dimensionieren und scheint das Problem im Moment gelöst zu haben.
quelle
Für Neulinge wie mich halfen diese Ressourcen:
Suchen der Datei apc.ini, um die von c33s oben empfohlenen Änderungen vorzunehmen, und Festlegen der empfohlenen Mengen: http://www.untwistedvortex.com/optimizing-tuning-apc-alternate-php-cache/
Verstehen, was apc.ttl ist: http://www.php.net/manual/en/apc.configuration.php#ini.apc.ttl
Grundlegendes zu apc.shm_size: http://www.php.net/manual/en/apc.configuration.php#ini.apc.shm-size
quelle
Wie Bokan erwähnt hat, können Sie den Speicher erhöhen, falls verfügbar, und er hat Recht damit, wie kontraproduktiv das Setzen von TTL auf 0 ist.
Hinweis: So habe ich diesen Fehler für mein spezielles Problem behoben. Es ist ein allgemeines Problem, das durch viele Dinge verursacht werden kann. Befolgen Sie die folgenden Anweisungen nur, wenn Sie den Fehler erhalten und glauben, dass es durch das Laden doppelter PHP-Dateien in APC verursacht wird.
Das Problem, das ich hatte, war, als ich eine neue Version meiner PHP-Anwendung veröffentlichte. Dh alle meine .php-Dateien durch neue ersetzt APC würde beide Versionen in den Cache laden.
Da ich nicht genug Speicher für zwei Versionen der PHP-Dateien hatte, würde APC nicht mehr genügend Speicher haben.
Es gibt eine Option namens apc.stat, mit der APC angewiesen wird, zu überprüfen, ob sich eine bestimmte Datei geändert hat, und wenn ja, diese zu ersetzen. Dies ist normalerweise für die Entwicklung in Ordnung, da Sie ständig Änderungen vornehmen, diese jedoch in der Produktion normalerweise deaktiviert sind, wie dies bei mir der Fall war case - http://www.php.net/manual/en/apc.configuration.php#ini.apc.stat
Das Aktivieren von apc.stat würde dieses Problem beheben, wenn Sie mit dem Leistungseinbruch einverstanden sind.
Die Lösung, die ich für mein Problem gefunden habe, besteht darin, zu überprüfen, ob sich die Projektversion geändert hat. Wenn ja, leeren Sie den Cache und laden Sie die Seite neu.
quelle
Dies funktionierte für unsere Jungs (die eine Reihe von Wordpress-Sites auf demselben Server betreiben).
Die Speichereinstellungen in der Datei /etc/php.d/apc.ini wurden geändert. Es wurde auf 64 Millionen eingestellt, also haben wir es auf 128 Millionen verdoppelt.
apc.shm_size = 128M
quelle
Wenn man sich das Internet ansieht, kann es verschiedene Ursachen geben. In meinem Fall belasse ich alles außer ...
... löschte die unzähligen Warnungen, die ich früher bekam.
quelle
Ich habe die Fehlermeldung "Speicher für Pool kann nicht zugeordnet werden" erhalten, nachdem eine OpenCart-Installation auf einen anderen Server verschoben wurde. Ich habe auch versucht, das memory_limit zu erhöhen.
Der Fehler wurde gestoppt, nachdem ich die Berechtigungen der Datei in der Fehlermeldung so geändert hatte, dass der Benutzer, unter dem Apache ausgeführt wird (Apache, WWW-Daten usw.), Schreibzugriff hat. Anstatt / etc / group direkt zu ändern (oder die Dateien auf 0777 zu ändern), habe ich usermod verwendet:
Dann musste ich Apache neu starten, damit die Änderung wirksam wurde:
Oder
Oder was auch immer Ihr System verwendet, um Apache neu zu starten.
Wenn sich die Site auf Shared Hosting befindet, müssen Sie möglicherweise die Dateiberechtigungen mit einem FTP-Programm ändern oder sich an den Hosting-Anbieter wenden.
quelle
Um dieses Problem zu beheben, setzen Sie den Wert für apc.shm_size als Ganzzahl. Suchen Sie Ihre apc.ini-Datei (in meinem System apc.ini-Dateispeicherort /etc/php5/conf.d/apc.ini) und setzen Sie: apc.shm_size = 1000
quelle
Auf meinem System musste ich apc.shm_size = 64M in /usr/local/etc/php.ini (FreeBSD 9.1) einfügen, als ich mir apc.php ansah (das ich aus / usr / local / share / doc / APC kopierte /apc.php to / usr / local / www / apache24 / data) Ich stellte fest, dass die Cache-Größe von 32M auf 64M gestiegen war und ich keine große Cache-Vollanzahl mehr erhielt
Referenzen: http://au1.php.net/manual/en/apc.configuration.php Lesen Sie auch Bokans Kommentare, sie waren sehr hilfreich
quelle
Überwachen Sie die Größe Ihrer zwischengespeicherten Dateien (Sie können apc.php aus dem Paket apc pecl verwenden) und erhöhen Sie apc.shm_size entsprechend Ihren Anforderungen.
Dies löst das Problem.
quelle