Was führt dazu, dass in PHP kein Speicher für Pool zugeordnet werden kann?

133

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_limitohne 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.

Jonathanatx
quelle

Antworten:

90

Wahrscheinlich ist APC verwandt.

Geben Sie für Personen mit diesem Problem die INI-Einstellungen an. Insbesondere Ihre Einstellung apc.mmap_file_mask.

Für eine dateibasierte mmap sollte Folgendes festgelegt werden:

apc.mmap_file_mask=/tmp/apc.XXXXXX

Verwenden Sie: mmap direkt von / dev / zero:

apc.mmap_file_mask=/dev/zero

Verwenden Sie für POSIX-kompatible mmap mit gemeinsamem Speicher:

apc.mmap_file_mask=/apc.shm.XXXXXX
Frankie
quelle
Vielen Dank! Das ist genau der Link, nach dem ich gesucht hatte. Schätzen Sie die Hilfe!
Jonathanatx
2
Ich habe festgestellt, dass diese Änderungen das Problem nicht beheben, da die Kommentare im verlinkten Thread auch dokumentieren ...
Jonathan Day
3
Weitere Informationen zu dieser APC-Einstellung: php.net/apc.configuration#ini.apc.mmap-file-mask
mikeytown2
2
In meinem Fall musste ich von dateisicher auf POSIX-kompatibel wechseln, um den Fehler zu beseitigen.
Attila Fulop
4
Ich kann nicht verstehen, wie diese Antwort das Problem löst. Tritt der Fehler auf, wenn der file_masknicht einer dieser Werte ist? Wenn ich einen dieser Werte habe und den Fehler erhalte, muss ich ihn auf einen anderen umstellen? Welcher?
Jeff
125

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:

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

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.

Bokan
quelle
2
Dies! Ich verwende Wordpress und 32M war einfach nicht genug. Auf 64M erhöht und jetzt klar. Überprüfen Sie apc.php Leute!
Dave Drager
Gute Antwort! +1 Danke.
Kostanos
Um auf 64M zu erhöhen, müssen Sie apc.shm_size = 64 und nicht apc.shm_size = 64M hinzufügen (das meiste Beispiel, das ich am Ende gesehen habe, hatte ein M). Hat bei meiner Version von apc (v3.1.3p1) nicht funktioniert
Patrick Forget
1
Sie gehen davon aus, dass Sie viele zwischengespeicherte Dateien haben, die länger als die TTL im Cache waren. c33s hat einen wichtigen Punkt. Wenn kürzlich auf alles zugegriffen wurde (nehmen wir an, Sie haben 70% des Caches, auf den die ganze Zeit zugegriffen wird, wie Sie möchten, und eine große Spitze, in der viele zusätzliche seltene Dateien gleichzeitig hinzugefügt werden), werden Fehler angezeigt für TTL Sekunden geworfen. Der Cache ist voll, und Sie haben APC mitgeteilt, dass diese Einträge nicht gelöscht werden sollen, damit es sich beschwert. Wenn Sie 5 Stunden lang über TTL verfügen, treten Fehler im Wert von 5 Stunden auf, die darauf warten, dass diese seltenen Dateien ablaufen.
Matthew Kolb
@MatthewKolb: Sie sollten nicht zulassen, dass mehr Dateien zwischengespeichert werden, als APC in seinem Speicher speichern kann. Verwenden Sie Filter, um zu verhindern, dass Dateien, auf die selten zugegriffen wird, zwischengespeichert werden.
Bokan
36

Lösung für mich:

  • apc.ttl = 0
  • apc.shm_size = alles was du willst

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

c33s
quelle
2
Danke, das hat geholfen. Ich bekam ungefähr ein Dutzend Fehler "Speicher kann nicht zugeordnet werden" pro Sekunde. Ich habe meine Cache-Größe verdoppelt (32 bis 64 MB) und die ttl auf 0 gesenkt. Dadurch wurden diese Fehler vollständig behoben.
Nicktacular
1
Dies war das Update auf unseren Servern.
Justin
1
Dies schien das Problem auch für mich zu beheben.
Anisoptera
1
Die Verwendung von ZWAMP und dies scheint auch den Trick getan zu haben. Vielen Dank.
WernerCD
10
Dies ist keine Lösung! Der Fehler verschwindet, aber APC wird fast deaktiviert. Jedes Mal, wenn der Speicher voll ist, wird der gesamte Cache geleert. Lesen Sie einfach das Handbuch, das Brideau uns gegeben hat. php.net/manual/en/apc.configuration.php#ini.apc.ttl.
Bokan
7

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.

Brice D.
quelle
1
Wie c33s sagte: Laden Sie den Extrakt 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
Bokan
4

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

Brideau
quelle
Danke, Sie haben auf die richtige Lösung hingewiesen. Das Verringern der TTL entspricht dem Deaktivieren von APC.
Bokan
4

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.

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);
}
Jase Whatson
quelle
2

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

Peter Drinnan
quelle
1

Wenn man sich das Internet ansieht, kann es verschiedene Ursachen geben. In meinem Fall belasse ich alles außer ...

apc.shm_size = 64M

... löschte die unzähligen Warnungen, die ich früher bekam.

Löwe
quelle
1

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:

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

Dann musste ich Apache neu starten, damit die Änderung wirksam wurde:

apachectl restart

Oder

sudo /etc/init.d/httpd restart

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.

Brent Self
quelle
1

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

Bialy7
quelle
1

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

Andrew
quelle
0

Ü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.

Lazcorp
quelle