Cosa sta causando "Impossibile allocare memoria per pool" in PHP?


133

Di tanto in tanto mi sono imbattuto nel limite di allocazione della memoria di un server, in particolare con un'applicazione gonfia come Wordpress, ma non ho mai incontrato "Impossibile allocare memoria per il pool" e ho problemi a rintracciare qualsiasi informazione.

Qualcuno sa cosa significa? Ho provato ad aumentare il memory_limitsenza successo. Inoltre non ho apportato modifiche significative all'applicazione. Un giorno non ci sono stati problemi, il giorno dopo ho riscontrato questo errore.

Risposte:


90

Probabilmente è legato all'APC.

Per le persone che hanno questo problema, specifica le impostazioni .ini. In particolare l'impostazione apc.mmap_file_mask.

Per mmap supportato da file, dovrebbe essere impostato su qualcosa del tipo:

apc.mmap_file_mask=/tmp/apc.XXXXXX

Per mmap direttamente da / dev / zero, utilizzare:

apc.mmap_file_mask=/dev/zero

Per mmap con supporto di memoria condivisa conforme POSIX, utilizzare:

apc.mmap_file_mask=/apc.shm.XXXXXX

Grazie! Questo è esattamente il link che stavo cercando. Apprezzo l'aiuto!
jonathanatx,

2
Ho scoperto che queste modifiche non risolvono il problema, poiché anche i commenti sul thread collegato documentano ...
Jonathan Day

3
Maggiori informazioni per questa impostazione APC: php.net/apc.configuration#ini.apc.mmap-file-mask
mikeytown2

2
Nel mio caso ho dovuto passare dal backup di file a conforme POSIX per eliminare l'errore.
Attila Fulop,

4
Non riesco a capire come questa risposta risolva il problema. L'errore si verifica quando file_masknon è uno di questi valori? Se ho uno di questi valori e visualizzo l'errore, devo cambiarlo con uno diverso? Quale?
Jeff,

125

L'uso di un TTL pari a 0 significa che APC scaricherà tutta la cache quando esaurisce la memoria. L'errore non appare più ma rende APC molto meno efficiente. È una decisione senza rischi, senza problemi, "Non voglio fare il mio lavoro". APC non è pensato per essere utilizzato in questo modo. Dovresti scegliere un TTL abbastanza alto in modo che le pagine più visitate non scadano. La cosa migliore è fornire memoria sufficiente in modo che APC non debba svuotare la cache.

Basta leggere il manuale per capire come viene usato ttl: http://www.php.net/manual/en/apc.configuration.php#ini.apc.ttl

La soluzione è aumentare la memoria allocata ad APC. Fallo aumentando apc.shm_size.

Se APC viene compilato per utilizzare la memoria del segmento condivisa, il sistema operativo sarà limitato. Digita questo comando per visualizzare il limite di sistema per ciascun segmento:

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

Per assegnare più memoria dovrai aumentare il numero di segmenti con il parametro apc.shm_segments.

Se APC utilizza la memoria mmap, non hai limiti. La quantità di memoria è ancora definita dalla stessa opzione apc.shm_size.

Se non c'è memoria sufficiente sul server, utilizzare l'opzione filtri per impedire la memorizzazione nella cache dei file php a cui si accede meno frequentemente.

Ma non usare mai un TTL di 0.

Come diceva c33s, usa apc.php per controllare la tua configurazione. Copia il file dal pacchetto apc in una cartella web e punta il browser su di esso. Vedrai cosa è realmente allocato e come viene utilizzato. I grafici devono rimanere stabili dopo ore, se cambiano completamente ad ogni aggiornamento, significa che la configurazione è errata (APC sta scaricando tutto). Assegna il 20% di RAM in più rispetto a ciò che APC utilizza realmente come margine di sicurezza e controllalo regolarmente.

L'impostazione predefinita di consentire solo 32 MB è ridicolmente bassa. PHP è stato progettato quando i server erano 64 MB e la maggior parte degli script utilizzava un file php per pagina. Oggi soluzioni come Magento richiedono più di 10k file (~ 60 Mb in APC). Dovresti consentire abbastanza memoria in modo che la maggior parte dei file php siano sempre memorizzati nella cache. Non è uno spreco, è più efficiente mantenere opcode in ram piuttosto che avere il php raw corrispondente nella cache dei file. Al giorno d'oggi siamo in grado di trovare server dedicati con 24 GB di memoria a partire da $ 80 al mese, quindi non esitate a consentire diversi GB ad APC. Ho messo 2 GB su 24 GB su un server che ospita negozi 5Magento e ~ 40 siti Web wordpress, APC utilizza 1,2 GB. Conta 64 MB per l'installazione di Magento, 40 MB per un Wordpress con alcuni plugin.

Inoltre, se hai siti Web di sviluppo sullo stesso server. Escluderli dalla cache.


2
Questo! Sto usando Wordpress e 32M non era abbastanza. Aumentato a 64 M e ora in chiaro. Controlla le persone di apc.php!
Dave Drager,

Buona risposta! +1 Grazie.
Kostanos,

Per aumentare a 64M devi aggiungere apc.shm_size = 64 e non apc.shm_size = 64M (la maggior parte degli esempi che ho visto aveva una M alla fine) Non ha funzionato sulla mia versione di apc (v3.1.3p1)
Patrick dimentica il

1
Stai assumendo che avrai molti file memorizzati nella cache che sono stati nella cache più a lungo del TTL. c33s ha un punto importante. Se è stato eseguito l'accesso di recente a tutto ciò (supponiamo che tu abbia il 70% della cache che ti accede tutte le volte che vuoi e hai un grosso picco in cui molti file extra rari vengono aggiunti tutti in una volta), otterrai errori lanciato per i secondi TTL. La cache è piena e hai detto ad APC che non dovrebbe cancellare queste voci, quindi si lamenta. Se hai TTL per 5 ore, finisci con 5 ore di errori in attesa della scadenza di quei file rari.
Matthew Kolb,

@MatthewKolb: non si dovrebbe consentire la memorizzazione nella cache di più file di quanti APC possa contenere in memoria. Utilizzare i filtri per impedire la memorizzazione nella cache dei file a cui si accede raramente.
bokan,

36

soluzione per me:

  • apc.ttl = 0
  • apc.shm_size = tutto quello che vuoi

modifica inizio

avvertimento!

@bokan mi ha indicato che avrei dovuto aggiungere un avviso qui.

se hai un ttl di 0 questo significa che ogni elemento memorizzato nella cache può essere rimosso immediatamente. quindi se hai una piccola dimensione della cache come 2mb e un ttl di 0 questo renderebbe l'apc inutile, perché i dati nella cache vengono sempre sovrascritti.

abbassare il ttl significa solo che la cache non può essere piena, solo con elementi che non possono essere sostituiti.

quindi devi scegliere un buon equilibrio tra ttl e dimensione della cache.

nel mio caso avevo una dimensione della cache di 1 GB, quindi era più che sufficiente per me.

modifica fine

ha avuto lo stesso problema su centos 5 con php 5.2.17 e ho notato che se la dimensione della cache è piccola e il parametro ttl è "alto" (come 7200) pur avendo molti file php da memorizzare nella cache, la cache si riempie abbastanza velocemente e apc non trova nulla che possa rimuovere perché tutti i file nella cache si adattano ancora al ttl.

aumentare la dimensione della memoria è solo una soluzione parziale, si esegue ancora questo errore se la cache si riempie e tutti i file si trovano nel ttl.

quindi la mia soluzione era di impostare ttl su 0, quindi apc riempie la cache e c'è sempre la possibilità che apc cancelli un po 'di memoria per i nuovi dati.

spero che aiuti

modifica: vedi anche: http://pecl.php.net/bugs/bug.php?id=16966

scarica http://pecl.php.net/get/APC estrae ed esegui apc.php, lì hai un bel diagramma di come appare l'utilizzo della cache


2
Grazie, questo mi ha aiutato. Stavo ottenendo circa una dozzina di errori "Impossibile allocare memoria" al secondo. Ho raddoppiato la dimensione della mia cache (da 32 a 64 MB) e ho lasciato il ttl a 0. Ciò ha rimosso completamente questi errori.
spettacolare

1
Questa è stata la correzione sui nostri server.
Giustino,

1
Ciò sembrava risolvere anche il problema per me.
anisoptera

1
L'uso di ZWAMP e questo sembra aver fatto anche il trucco. Grazie.
WernerCD

10
Questa non è una soluzione! L'errore scompare ma APC sarà quasi disabilitato. Svuota tutta la cache ogni volta che la memoria è piena. Leggi il manuale che ci ha dato Brideau. php.net/manual/en/apc.configuration.php#ini.apc.ttl.
bokan,

7

L'esecuzione dello script apc.php è la chiave per capire qual è il tuo problema, IMO. Questo ci ha aiutato a dimensionare correttamente la nostra cache e, per il momento, sembra aver risolto il problema.


1
come ha detto c33s: scarica pecl.php.net/get/APC estrae ed esegui apc.php, ecco un bel diagramma di come appare l'utilizzo della cache
bokan

4

Per i neofiti come me, queste risorse hanno aiutato:

Trovare il file apc.ini per apportare le modifiche consigliate da c33s sopra e impostare gli importi consigliati: http://www.untwistedvortex.com/optimizing-tuning-apc-alternate-php-cache/

Capire cos'è apc.ttl: http://www.php.net/manual/en/apc.configuration.php#ini.apc.ttl

Capire cos'è apc.shm_size: http://www.php.net/manual/en/apc.configuration.php#ini.apc.shm-size


Grazie, hai indicato la soluzione giusta. Abbassare il TTL è come disabilitare l'APC.
bokan,

4

Come ha detto Bokan, puoi aumentare la memoria, se disponibile, e ha ragione su quanto sia controproducente l'impostazione TTL su 0.

Nota: ecco come ho risolto questo errore per il mio problema specifico. È un problema generico che può essere causato da un sacco di cose, quindi segui quanto segue se ricevi l'errore e pensi che sia causato dal caricamento di file PHP duplicati in APC.

Il problema che stavo riscontrando era quando ho rilasciato una nuova versione della mia applicazione PHP. Vale a dire che tutti i miei file .php sono stati sostituiti con nuovi APC che avrebbero caricato entrambe le versioni nella cache.

Perché non avevo memoria sufficiente per due versioni dei file php, APC avrebbe esaurito la memoria.

C'è un'opzione chiamata apc.stat per dire ad APC di verificare se un determinato file è cambiato e, in tal caso, sostituirlo, questo in genere va bene per lo sviluppo perché si apportano costantemente modifiche, tuttavia sulla produzione di solito è spento come era nel mio case - http://www.php.net/manual/en/apc.configuration.php#ini.apc.stat

L'attivazione di apc.stat risolverà questo problema se si va bene con l'hit di prestazioni.

La soluzione che ho trovato per il mio problema è verificare se la versione del progetto è cambiata e in tal caso svuotare la cache e ricaricare la pagina.

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);
}

2

Questo ha funzionato per i nostri ragazzi (eseguendo una serie di siti Wordpress sullo stesso server).

Modificate le impostazioni della memoria nel file /etc/php.d/apc.ini. Era impostato su 64M, quindi l'abbiamo raddoppiato a 128M.

apc.shm_size = 128M


1

Guardando le internet ci possono essere varie cause. Nel mio caso lasciare tutto predefinito tranne ...

apc.shm_size = 64M

... cancellato gli innumerevoli avvertimenti che stavo ricevendo prima.


1

Ho ricevuto l'errore "Impossibile allocare memoria per il pool" dopo aver spostato un'installazione OpenCart su un altro server. Ho anche provato a sollevare memory_limit.

L'errore si è interrotto dopo aver modificato le autorizzazioni del file nel messaggio di errore per consentire all'utente di accedere in scrittura come apache viene eseguito (apache, www-data, ecc.). Invece di modificare direttamente / etc / group (o modificare i file in 0777), ho usato usermod:

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

Quindi ho dovuto riavviare apache per rendere effettive le modifiche:

apachectl restart

O

sudo /etc/init.d/httpd restart

O qualunque cosa il tuo sistema usi per riavviare apache.

Se il sito è su hosting condiviso, forse è necessario modificare le autorizzazioni dei file con un programma FTP o contattare il fornitore di hosting?


1

Per risolvere questo problema, impostare il valore per apc.shm_size come numero intero Individuare il file apc.ini (nella posizione del file apc.ini nel mio sistema /etc/php5/conf.d/apc.ini) e impostare: apc.shm_size = 1000


1

sul mio sistema ho dovuto inserire apc.shm_size = 64M in /usr/local/etc/php.ini (FreeBSD 9.1) quindi quando ho guardato apc.php (che ho copiato da / usr / local / share / doc / APC /apc.php a / usr / local / www / apache24 / data) ho scoperto che la dimensione della cache era aumentata dal valore predefinito da 32M a 64M e non ottenevo più un conteggio completo della cache di grandi dimensioni

riferimenti: http://au1.php.net/manual/en/apc.configuration.php anche letto i commenti di Bokan, sono stati molto utili


0

Monitora le dimensioni dei tuoi file memorizzati nella cache (puoi usare apc.php dal pacchetto apc pecl) e aumentare apc.shm_size in base alle tue esigenze.

Questo risolve il problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.