Qu'est-ce qui cause «Impossible d'allouer de la mémoire pour le pool» en PHP?

133

Je me suis parfois heurté à la limite d'allocation de mémoire d'un serveur, en particulier avec une application surchargée comme Wordpress, mais je n'ai jamais rencontré «Impossible d'allouer de la mémoire pour le pool» et j'ai du mal à retrouver les informations.

Quelqu'un sait-il ce que cela signifie? J'ai essayé d'augmenter le memory_limitsans succès. Je n'ai pas non plus apporté de modifications importantes à l'application. Un jour, il n'y a pas eu de problème, le lendemain j'ai rencontré cette erreur.

Jonathanatx
la source

Réponses:

90

Est probablement lié à APC.

Pour les personnes ayant ce problème, veuillez spécifier vos paramètres .ini. Plus précisément, votre paramètre apc.mmap_file_mask.

Pour mmap sauvegardé sur fichier, il doit être défini sur quelque chose comme:

apc.mmap_file_mask=/tmp/apc.XXXXXX

Pour mmap directement depuis / dev / zero, utilisez:

apc.mmap_file_mask=/dev/zero

Pour mmap à mémoire partagée compatible POSIX, utilisez:

apc.mmap_file_mask=/apc.shm.XXXXXX
Frankie
la source
Merci! C'est exactement le lien que je recherchais. Appréciez l'aide!
jonathanatx
2
J'ai constaté que ces modifications ne résolvent pas le problème, car les commentaires sur le fil lié documentent également ...
Jonathan Day
3
Plus d'informations pour ce paramètre APC: php.net/apc.configuration#ini.apc.mmap-file-mask
mikeytown2
2
Dans mon cas, j'ai dû passer de la sauvegarde sur fichier à la conformité POSIX afin de me débarrasser de l'erreur.
Attila Fulop
4
Je ne sais pas comment cette réponse résout le problème. L'erreur se produit-elle lorsque le file_maskn'est pas l'une de ces valeurs? Si j'ai l'une de ces valeurs et que j'obtiens l'erreur, dois-je la changer pour une autre? Laquelle?
Jeff
125

L'utilisation d'un TTL de 0 signifie qu'APC videra tout le cache lorsqu'il sera à court de mémoire. L'erreur n'apparaît plus, mais cela rend APC beaucoup moins efficace. C'est une décision sans risque, sans problème, "je ne veux pas faire mon travail". APC n'est pas destiné à être utilisé de cette façon. Vous devez choisir un TTL suffisamment élevé pour que les pages les plus consultées n'expirent pas. Le mieux est de donner suffisamment de mémoire pour qu'APC n'ait pas besoin de vider le cache.

Lisez simplement le manuel pour comprendre comment ttl est utilisé: http://www.php.net/manual/en/apc.configuration.php#ini.apc.ttl

La solution consiste à augmenter la mémoire allouée à APC. Pour ce faire, augmentez apc.shm_size.

Si APC est compilé pour utiliser la mémoire de segment partagée, vous serez limité par votre système d'exploitation. Tapez cette commande pour voir la limite de votre système pour chaque segment:

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

Pour allouer plus de mémoire, vous devrez augmenter le nombre de segments avec le paramètre apc.shm_segments.

Si APC utilise la mémoire mmap, vous n'avez aucune limite. La quantité de mémoire est toujours définie par la même option apc.shm_size.

S'il n'y a pas assez de mémoire sur le serveur, utilisez l'option filters pour empêcher la mise en cache des fichiers php moins fréquemment utilisés.

Mais n'utilisez jamais un TTL de 0.

Comme c33s l'a dit, utilisez apc.php pour vérifier votre configuration. Copiez le fichier du package apc dans un dossier Web et pointez le navigateur vers celui-ci. Vous verrez ce qui est réellement alloué et comment il est utilisé. Les graphiques doivent rester stables après des heures, s'ils changent complètement à chaque actualisation, cela signifie que votre configuration est erronée (APC vide tout). Allouez 20% de RAM en plus que ce qu'APC utilise réellement comme marge de sécurité et vérifiez-la régulièrement.

La valeur par défaut de n'autoriser que 32 Mo est ridiculement basse. PHP a été conçu lorsque les serveurs faisaient 64 Mo et que la plupart des scripts utilisaient un fichier php par page. De nos jours, des solutions comme Magento nécessitent plus de 10k fichiers (~ 60 Mo en APC). Vous devez prévoir suffisamment de mémoire pour que la plupart des fichiers php soient toujours mis en cache. Ce n'est pas un gaspillage, il est plus efficace de conserver l'opcode en RAM plutôt que d'avoir le php brut correspondant dans le cache de fichiers. De nos jours, nous pouvons trouver des serveurs dédiés avec 24 Go de mémoire pour aussi peu que 80 $ / mois, alors n'hésitez pas à autoriser plusieurs Go à APC. J'ai mis 2 Go sur 24 Go sur un serveur hébergeant des magasins 5Magento et ~ 40 site Web wordpress, APC utilise 1,2 Go. Comptez 64 Mo pour l'installation de Magento, 40 Mo pour un Wordpress avec quelques plugins.

Aussi, si vous avez des sites de développement sur le même serveur. Excluez-les du cache.

bokan
la source
2
Ce! J'utilise Wordpress et 32M n'était tout simplement pas suffisant. Passé à 64M et maintenant en clair. Vérifiez les gens apc.php!
Dave Drager
Bonne réponse! +1 Merci.
Kostanos le
Pour passer à 64M, vous devez ajouter apc.shm_size = 64 et non apc.shm_size = 64M (la plupart des exemples que j'ai vus avaient un M à la fin) Cela ne fonctionnait pas sur ma version d'apc (v3.1.3p1)
Patrick Forget
1
Vous supposez que vous aurez beaucoup de fichiers mis en cache qui ont été dans le cache plus longtemps que le TTL. c33s a un point important. Si tout a été récemment accédé (disons que vous avez 70% du cache qui est accédé tout le temps comme vous le souhaitez et que vous avez un gros pic où de nombreux fichiers supplémentaires peu fréquents sont ajoutés en même temps), vous allez avoir des erreurs lancé pendant TTL secondes. Le cache est plein et vous avez dit à APC qu'il ne devrait pas effacer ces entrées, donc il se plaint. Si vous avez TTL pendant 5 heures, vous vous retrouvez avec 5 heures d'erreurs en attente d'expiration de ces fichiers peu fréquents.
Matthew Kolb
@MatthewKolb: Vous ne devez pas autoriser la mise en cache de plus de fichiers qu'APC ne peut en contenir dans sa mémoire. Utilisez des filtres pour empêcher la mise en cache des fichiers rarement consultés.
bokan
36

solution pour moi:

  • apc.ttl = 0
  • apc.shm_size = tout ce que vous voulez

modifier début

avertissement!

@bokan m'a indiqué que je devrais ajouter un avertissement ici.

si vous avez un ttl de 0, cela signifie que chaque élément mis en cache peut être purgé immédiatement. donc si vous avez une petite taille de cache comme 2 Mo et un ttl de 0, cela rendrait l'apc inutile, car les données du cache sont toujours écrasées.

abaisser le ttl signifie seulement que le cache ne peut pas devenir plein, uniquement avec des éléments qui ne peuvent pas être remplacés.

il faut donc choisir un bon équilibre entre ttl et taille du cache.

dans mon cas, j'avais une taille de cache de 1 Go, donc c'était plus que suffisant pour moi.

modifier la fin

eu le même problème sur centos 5 avec php 5.2.17 et a remarqué que si la taille du cache est petite et que le paramètre ttl est "élevé" (comme 7200) tout en ayant beaucoup de fichiers php à mettre en cache, le cache se remplit assez rapidement et apc ne trouve rien qu'il puisse supprimer car tous les fichiers du cache tiennent toujours dans le ttl.

l'augmentation de la taille de la mémoire n'est qu'une solution partielle, vous exécutez toujours cette erreur si le cache se remplit et que tous les fichiers sont dans le ttl.

donc ma solution était de mettre le ttl à 0, donc apc remplit le cache et il y a toujours la possibilité pour apc d'effacer de la mémoire pour de nouvelles données.

J'espère que cela pourra aider

edit: voir aussi: http://pecl.php.net/bugs/bug.php?id=16966

téléchargez http://pecl.php.net/get/APC extract et exécutez l'apc.php, vous avez là un joli diagramme à quoi ressemble votre utilisation du cache

c33s
la source
2
Merci, cela a aidé. J'obtenais environ une douzaine d'erreurs «Impossible d'allouer de la mémoire» par seconde. J'ai doublé la taille de mon cache (32 à 64 Mo) et j'ai laissé tomber le ttl à 0. Cela a complètement supprimé ces erreurs.
nicktacular
1
C'était le correctif sur nos serveurs.
Justin
1
Cela semblait aussi résoudre le problème pour moi.
anisoptera
1
Utiliser ZWAMP et cela semble également avoir fait l'affaire. Merci.
WernerCD
10
Ce n'est pas une solution ! L'erreur disparaît mais APC sera presque désactivé. Il videra tout le cache chaque fois que la mémoire est pleine. Il suffit de lire le manuel que Brideau nous a donné. php.net/manual/en/apc.configuration.php#ini.apc.ttl.
bokan
7

L'exécution du script apc.php est la clé pour comprendre quel est votre problème, IMO. Cela nous a aidés à dimensionner correctement notre cache et, pour le moment, semble avoir résolu le problème.

Brice D
la source
1
comme c33s l'a dit: téléchargez l' extrait de pecl.php.net/get/APC et exécutez l'apc.php, vous avez là un joli diagramme à quoi ressemble votre utilisation du cache
bokan
4

Pour les débutants comme moi, ces ressources ont aidé:

Recherche du fichier apc.ini pour effectuer les modifications recommandées par c33s ci-dessus et définition des quantités recommandées: http://www.untwistedvortex.com/optimizing-tuning-apc-alternate-php-cache/

Comprendre ce qu'est apc.ttl: http://www.php.net/manual/en/apc.configuration.php#ini.apc.ttl

Comprendre ce qu'est apc.shm_size: http://www.php.net/manual/en/apc.configuration.php#ini.apc.shm-size

Brideau
la source
Merci, vous avez indiqué la bonne solution. Réduire le TTL revient à désactiver APC.
bokan
4

Comme Bokan l'a mentionné, vous pouvez augmenter la mémoire si disponible, et il a raison sur le fait que le réglage TTL à 0 est contre-productif.

Remarque: c'est ainsi que j'ai corrigé cette erreur pour mon problème particulier. C'est un problème générique qui peut être causé par de nombreuses choses, alors ne suivez ce qui suit que si vous obtenez l'erreur et que vous pensez que cela est dû au chargement de fichiers PHP en double dans APC.

Le problème que j'avais était lorsque j'ai publié une nouvelle version de mon application PHP. Ie remplacé tous mes fichiers .php par de nouveaux APC chargerait les deux versions dans le cache.

Parce que je n'avais pas assez de mémoire pour deux versions des fichiers php, APC manquerait de mémoire.

Il existe une option appelée apc.stat pour dire à APC de vérifier si un fichier particulier a changé et si c'est le cas de le remplacer, cela convient généralement au développement car vous apportez constamment des modifications, mais en production, il est généralement désactivé comme dans mon cas - http://www.php.net/manual/en/apc.configuration.php#ini.apc.stat

L'activation de apc.stat résoudrait ce problème si vous êtes d'accord avec les performances.

La solution que j'ai trouvée pour mon problème est de vérifier si la version du projet a changé et, le cas échéant, de vider le cache et de recharger la page.

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
la source
2

Cela a fonctionné pour nos gars (exécutant une multitude de sites Wordpress sur le même serveur).

Modification des paramètres de mémoire dans le fichier /etc/php.d/apc.ini. Il était fixé à 64M, nous l'avons donc doublé à 128M.

apc.shm_size = 128 Mo

Peter Drinnan
la source
1

En regardant les internets, il peut y avoir diverses causes. Dans mon cas, tout laisser par défaut sauf ...

apc.shm_size = 64M

... effacé les innombrables avertissements que je recevais plus tôt.

Leo
la source
1

J'ai reçu l'erreur «Impossible d'allouer de la mémoire pour le pool» après avoir déplacé une installation OpenCart vers un serveur différent. J'ai également essayé d'augmenter la limite de mémoire.

L'erreur s'est arrêtée après que j'ai changé les autorisations du fichier dans le message d'erreur pour avoir un accès en écriture par l'utilisateur sous lequel apache s'exécute (apache, www-data, etc.). Au lieu de modifier directement / etc / group (ou de chmoding les fichiers en 0777), j'ai utilisé usermod:

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

Ensuite, j'ai dû redémarrer apache pour que le changement prenne effet:

apachectl restart

Ou

sudo /etc/init.d/httpd restart

Ou tout ce que votre système utilise pour redémarrer apache.

Si le site est sur un hébergement mutualisé, vous devez peut-être modifier les autorisations de fichier avec un programme FTP ou contacter le fournisseur d'hébergement?

Brent Self
la source
1

Pour résoudre ce problème, définissez la valeur de apc.shm_size comme un entier Localisez votre fichier apc.ini (dans mon système, l'emplacement du fichier apc.ini /etc/php5/conf.d/apc.ini) et définissez: apc.shm_size = 1000

Bialy7
la source
1

sur mon système, j'ai dû insérer apc.shm_size = 64M dans /usr/local/etc/php.ini (FreeBSD 9.1) puis quand j'ai regardé apc.php (que j'ai copié de / usr / local / share / doc / APC /apc.php à / usr / local / www / apache24 / data) j'ai constaté que la taille du cache était passée de la valeur par défaut de 32 Mo à 64 Mo et que je n'obtenais plus un grand nombre de cache complet

références: http://au1.php.net/manual/en/apc.configuration.php lire également les commentaires de Bokan, ils ont été très utiles

Andrew
la source
0

Surveillez la taille de vos fichiers mis en cache (vous pouvez utiliser apc.php du package apc pecl) et augmentez apc.shm_size en fonction de vos besoins.

Cela résout le problème.

Lazcorp
la source