it-swarm.com.de

Was verursacht in PHP "Speicher für Pool kann nicht zugewiesen werden"?

Ich bin gelegentlich an die Speicherzuweisungsgrenze eines Servers gestoßen, insbesondere bei einer aufgeblähten Anwendung wie Wordpress. Ich habe jedoch nie festgestellt, dass "Speicher für Pool nicht zugewiesen werden kann" und Probleme beim Auffinden von Informationen auftreten.

Weiß jemand was das bedeutet? Ich habe versucht, den memory_limit ohne Erfolg zu erhöhen. Ich habe auch keine wesentlichen Änderungen an der Anwendung vorgenommen. Eines Tages gab es kein Problem, am nächsten Tag traf ich diesen Fehler.

130
jonathanatx

Wahrscheinlich ist APC verwandt.

Für die Personen, die dieses Problem haben, geben Sie bitte Ihre .ini-Einstellungen an. Speziell Ihre apc.mmap_file_mask-Einstellung.

Für dateiunterstützte mmap sollte Folgendes festgelegt werden:

apc.mmap_file_mask=/tmp/apc.XXXXXX

Um mmap direkt von/dev/zero zu erreichen, verwenden Sie:

apc.mmap_file_mask=/dev/zero

Verwenden Sie für POSIX-kompatible MMAP mit gemeinsamem Speicher die folgenden Funktionen:

apc.mmap_file_mask=/apc.shm.XXXXXX
89
Frankie

Die Verwendung einer TTL von 0 bedeutet, dass APC den gesamten Cache leert, wenn der Speicher voll ist. Der Fehler wird nicht mehr angezeigt, macht APC jedoch weniger effizient. Es ist kein Risiko, keine Mühe: "Ich möchte meine Arbeit nicht machen". APC soll nicht so verwendet werden. Sie sollten eine TTL hoch genug wählen, damit die am häufigsten aufgerufenen Seiten nicht verfallen. Am besten ist es, genügend Speicherplatz bereitzustellen, damit APC den Cache nicht leeren muss.

Lesen Sie einfach das Handbuch, um zu verstehen, wie TTL verwendet wird: http://www.php.net/manual/de/apc.configuration.php#ini.apc.ttl

Die Lösung besteht darin, den für APC zugewiesenen Speicher zu erhöhen. _. Tun Sie dies, indem Sie apc.shm_size erhöhen.

Wenn APC für die Verwendung von Shared Segment Memory kompiliert wird, werden 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, haben Sie keine Begrenzung. Die Speichermenge wird immer noch durch dieselbe Option apc.shm_size definiert. 

Wenn auf dem Server nicht genügend Speicherplatz vorhanden ist, verwenden Sie die Filteroption, um zu verhindern, dass PHP-Dateien mit weniger häufigem Zugriff zwischengespeichert werden.

Verwenden Sie aber niemals eine TTL von 0.

Wie gesagt, verwenden Sie 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 wird 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 löscht alles). Weisen Sie 20% mehr RAM zu, als APC wirklich als Sicherheitsmarge verwendet, und überprüfen Sie es regelmäßig.

Die Vorgabe, nur 32 MB zuzulassen, ist lächerlich niedrig. PHP wurde entwickelt, als Server 64 MB groß waren und die meisten Skripts eine PHP-Datei pro Seite verwendeten. Heutzutage erfordern Lösungen wie Magento mehr als 10 KB Dateien (~ 60 MB in APC). Sie sollten genügend Speicherplatz zulassen, damit die meisten PHP-Dateien immer zwischengespeichert werden. Es ist keine Verschwendung, es ist effizienter, Opcode in RAM zu speichern, anstatt den entsprechenden rohen PHP-Code im Dateicache zu haben .. Heutzutage können wir dedizierte Server mit 24 GB Speicher für nur 80 USD/Monat finden. Zögern Sie also nicht um mehrere GB für APC zuzulassen. Ich habe 2 GB von 24 GB auf einem Server, der 5Magento-Stores hostet, und ~ 40 Wordpress-Websites, APC verwendet 1,2 GB. Zählen Sie 64 MB für die Magento-Installation, 40 MB für Wordpress mit einigen Plugins.

Auch wenn Sie Websites auf demselben Server entwickelt haben. Schließen Sie sie aus dem Cache aus.

123
bokan

lösung für mich:

  • apc.ttl = 0 
  • apc.shm_size = alles, was Sie wollen

edit start

warnung!

@bokan zeigte mir an, dass ich hier eine Warnung hinzufügen sollte. 

wenn Sie eine TLL von 0 haben, bedeutet dies, dass jeder zwischengespeicherte Artikel sofort gelöscht werden kann. Wenn Sie also eine kleine Cache-Größe wie 2 MB und einen TTL-Wert von 0 haben, würde dies die APC-Datei unbrauchbar machen, da die Daten im Cache immer überschrieben werden.

ein Absenken des TTL bedeutet nur, dass der Cache nicht voll werden kann, sondern nur mit Elementen, die nicht ersetzt werden können.

sie müssen also eine gute Balance zwischen TTL- und Cache-Größe wählen.

in meinem Fall hatte ich eine Cache-Größe von 1 GB, also war es für mich mehr als genug.

edit end

hatte das gleiche Problem auf Centos 5 mit php 5.2.17 und bemerkte, dass, wenn die cache size klein ist und der ttl-Parameter "high" ist (wie 7200), während viele php-Dateien zum Zwischenspeichern haben, dann Der Cache füllt sich ziemlich schnell und apc findet nichts, was er entfernen kann, da alle Dateien in dem Cache noch in das TTL passen.

das Erhöhen der Speichergröße ist nur eine Teillösung. Sie führen den Fehler weiterhin in diesen Fehler aus, wenn der Cache voll ist und sich alle Dateien innerhalb des TLL befinden.

meine Lösung bestand also darin, das TLL auf 0 zu setzen, also füllt apc den Cache und Es besteht immer die Möglichkeit, dass apc etwas Speicher für newdata löscht.

hoffentlich hilft das

edit: Siehe auch: http://pecl.php.net/bugs/bug.php?id=16966

download http://pecl.php.net/get/APC extract und führen Sie die Datei apc.php aus. Dort haben Sie ein Nizza Diagramm, wie Ihre Cache-Nutzung aussieht

36
c33s

Das Ausführen des apc.php-Skripts ist der Schlüssel zum Verständnis Ihres Problems, IMO. Dies half uns dabei, unseren Cache richtig zu dimensionieren und scheint das Problem für den Moment gelöst zu haben.

6
Brice D

Für Neulinge wie mich haben diese Ressourcen geholfen:

Suchen der apc.ini-Datei, um die von c33s empfohlenen Änderungen vorzunehmen, und Festlegen der empfohlenen Beträge: http://www.untwistedvortex.com/optimizing-tuning-apc-alternate-php-cache/

Verstehen, was apc.ttl ist: http://www.php.net/manual/de/apc.configuration.php#ini.apc.ttl

Verstehen, was apc.shm_size ist: http://www.php.net/manual/de/apc.configuration.php#ini.apc.shm-size

4
Brideau

Wie Bokan bereits erwähnt hat, können Sie den Speicher aufrüsten, wenn verfügbar, und er hat Recht, wie kontraproduktiv die Einstellung TTL auf 0 ist.

NotE: So habe ich diesen Fehler für mein spezielles Problem behoben. Es ist ein generisches Problem, das durch eine Vielzahl von Dingen verursacht werden kann. Befolgen Sie daher die folgenden Anweisungen, wenn Sie den Fehler erhalten und denken, dass er durch doppelte PHP -Dateien verursacht wurde, die in APC geladen werden.

Mein Problem war, als ich eine neue Version meiner Anwendung PHP veröffentlichte. Dh alle meine .php-Dateien wurden durch neue ersetzt, und APC würde beide Versionen in den Cache laden.

Da ich nicht über genügend Speicher für zwei Versionen der PHP-Dateien verfügte, würde APC über genügend Speicher verfügen.

Es gibt eine Option mit dem Namen apc.stat, die APC anweist, zu überprüfen, ob sich eine bestimmte Datei geändert hat. Wenn dies so ist, ist dies normalerweise für die Entwicklung in Ordnung, da Sie ständig Änderungen vornehmen. In der Produktion ist sie jedoch normalerweise so deaktiviert, wie es in my war case - http://www.php.net/manual/de/apc.configuration.php#ini.apc.stat

Wenn Sie apc.stat aktivieren, wird dieses Problem behoben, wenn Sie mit dem Leistungstreffer zufrieden sind.

Die Lösung, die ich für mein Problem gefunden habe, ist zu prüfen, ob sich die Projektversion geändert hat, und wenn dies der Fall ist, den Cache leeren und die Seite neu laden. 

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

Dies funktionierte für unsere Jungs (eine Reihe von Wordpress-Sites auf demselben Server). 

Geänderte Speichereinstellungen in der Datei /etc/php.d/apc.ini. Es wurde auf 64M eingestellt, also verdoppelten wir es auf 128M.

apc.shm_size = 128M

2
Peter Drinnan

auf meinem System musste ich apc.shm_size = 64M in /usr/local/etc/php.ini(FreeBSD 9.1) einfügen. Als ich dann apc.php (die ich kopiert von /usr/local/share/doc/APC/apc.php nach /usr/local/www/Apache24/data)i stellte fest, dass die Cachegröße von 32 MB auf 64 MB gestiegen war und ich keine länger einen großen Cache voll zu zählen

referenzen: http://au1.php.net/manual/de/apc.configuration.php Lesen Sie auch Bokans Kommentare, sie waren sehr hilfreich

1
andrew

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 legen Sie Folgendes fest: apc.shm_size = 1000

1
Bialy7

Wenn man sich die Internets ansieht, kann es verschiedene Ursachen geben.

apc.shm_size = 64M

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

1
Leo

Ich habe den Fehler "Speicher für Pool kann nicht zugewiesen werden" nach dem Verschieben einer OpenCart-Installation auf einen anderen Server angezeigt. Ich habe auch versucht, das memory_limit zu erhöhen.

Der Fehler wurde gestoppt, nachdem ich die Berechtigungen der Datei in der Fehlernachricht so geändert habe, dass der Benutzer, auf den Apache ausgeführt wird, schreibgeschützt ist (Apache, WWW-Daten usw.). 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 wird:

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 den Hosting-Provider kontaktieren.

1
Brent Self

Überwachen Sie die Größe der zwischengespeicherten Dateien (Sie können apc.php aus dem Paket apc pecl verwenden) und erhöhen Sie entsprechend Ihrer Anforderungen die.

Das löst das Problem.

0
lazcorp