132 votes

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

Je suis parfois confronté à une limite d'allocation de mémoire du serveur, en particulier avec une application gonflée telle que Wordpress, mais je n'ai jamais rencontré "Impossible d'allouer de la mémoire pour le pool" et j'ai du mal à retrouver des informations.

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

124voto

bokan Points 2097

c33s est complètement faux et a 45 voix en ce moment, ce sont 45 personnes qui n'ont pas lu le manuel

À l'aide d'un TTL de 0 signifie que les APC vider tout le cache quand il est à court de mémoire. L'erreur n'apparaît plus, mais il fait APC beaucoup moins efficace. C'est un pas de risque, pas de problème, "je ne veux pas faire mon travail à la décision". L'APC n'est pas destiné à être utilisé de cette façon. Vous devez choisir une durée de vie assez élevée pour les plus consultées pages n'expirera pas. Le mieux est de donner suffisamment de mémoire pour APC n'a pas besoin de vider le cache.

Il suffit de lire le manuel pour comprendre comment ttl est utilisé : http://www.php.net/manual/en/apc.configuration.php#ini.apc.ttl

La solution est d'augmenter la mémoire allouée à l'APC. Ce grâce à une augmentation de l'apc.shm_size.

Si APC est compilé pour utiliser le Segment de Mémoire vous serez limité par votre système d'exploitation. Tapez cette commande pour voir votre système limite pour chaque segment :

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

Pour alocate plus de mémoire, vous aurez à augmenter le nombre de segments avec le paramètre de l'apc.shm_segments.

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

Si il n'y a pas assez de mémoire sur le serveur, puis utiliser l'option de filtres pour empêcher les moins souvent utilisées fichiers php d'être mis en cache.

Mais n'utilisez jamais un TTL de 0.

Comme c33s dit, télécharger apc.php pour vérifier votre config. Vous allez voir ce qui est vraiment affecté et comment il est utilisé. Les graphiques doivent rester stable après les heures de travail, si elles sont complètement en train de changer à chaque mise à jour, alors cela signifie que votre configuration est mauvaise (APC annule tout). Allouer 20% de plus de mémoire que ce que l'APC vraiment l'utiliser comme une marge de sécurité, et de vérifier sur une base régulière.

Le défaut de n'autoriser que de 32 mo est ridiculement bas. PHP a été conçu lors de l'un des serveurs ont été de 64 mo et la plupart des script ont été à l'aide d'un fichier php par page. Aujourd'hui, des solutions comme Magento nécessite plus de 10k fichiers (~60 mo APC). Vous devez prévoir suffisamment de mémoire de sorte que la plupart des fichiers php sont toujours mis en cache. Ce n'est pas un déchet, il est plus efficace de garder opcode en ram plutôt que de devoir le correspondant raw php dans le fichier de cache. Aujourd'hui, on peut trouver des serveurs dédiés avec 24 go de mémoire pour aussi peu que $80/mois, donc n'hésitez pas à permettre à plusieurs GO à l'APC. J'ai mis 2 GO de 24 GO sur un serveur d'hébergement 5Magento magasins et ~40 site wordpress, APC utilise 1.2 GO. Le comte de 64 mo pour l'installation de Magento, 40 mo pour un Wordpress avec des plugins.

89voto

Frankie Points 12557

Probablement est lié à APC.

Pour les personnes ayant ce problème, veuillez spécifier vos paramètres .ini. Spécifiquement votre paramètre apc.mmap_file_mask.

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

 apc.mmap_file_mask=/tmp/apc.XXXXXX
 

Pour mapper directement depuis / dev / zero, utilisez:

 apc.mmap_file_mask=/dev/zero
 

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

 apc.mmap_file_mask=/apc.shm.XXXXXX
 

36voto

c33s Points 1393

pour moi, la solution:

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

edit commencer

avertissement!

@bokan m'indiqua que je devrais ajouter un avertissement ici.

si vous avez un ttl de 0 cela signifie que chaque élément de mise en cache peut être immédiatement supprimées. donc, si vous avez une petite taille de la mémoire cache comme 2mb et une durée de vie de 0 cela rendrait l'apc inutile, car les données dans le cache est toujours remplacé.

l'abaissement de la durée de vie signifie seulement que le cache ne peut pas devenir plein, uniquement avec des objets qui ne peuvent pas être remplacés.

si vous avez à choisir un bon équilibre entre la durée de vie et taille du cache.

dans mon cas, j'ai eu une taille de mémoire cache de 1 go, donc c'était plus que suffisant pour moi.

edit de fin

eu le même problème sur centos 5 avec php version 5.2.17 et a remarqué que si l' taille de la mémoire cache est de petite taille et le paramètre ttl est "élevé" (7200), tandis que le fait d'avoir beaucoup de php, les fichiers de cache, le cache se remplit très vite et de l'apc n'a rien trouvé de qui il peut le retirer, car tous les fichiers dans le cache toujours s'inscrire dans la durée de vie.

l'augmentation de la taille de la mémoire n'est qu'une partie de la solution, vous courez toujours dans cette erreur si vous cache se remplit et tous les fichiers qui sont à l'intérieur de la durée de vie.

donc, ma solution a été de définir la durée de vie à 0, donc apc remplit la mise en cache d'un il y a toujours la possibilité, pour les apc pour effacer de la mémoire pour les nouveaux les données.

espère que ça aide

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

télécharger http://pecl.php.net/get/APC extraire et exécuter les apc.php, vous avez là un joli diagramme de la façon dont votre utilisation du cache de ressembler à

7voto

Brice D Points 61

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

4voto

Brideau Points 189

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

Trouver l'apc.fichier ini pour faire les modifications recommandées par c33s ci-dessus, et à fixer les quantités recommandées: http://www.untwistedvortex.com/optimizing-tuning-apc-alternate-php-cache/

La compréhension de ce que l'apc.ttl est: http://www.php.net/manual/en/apc.configuration.php#ini.apc.ttl

La compréhension de ce que l'apc.shm_size est: http://www.php.net/manual/en/apc.configuration.php#ini.apc.shm-size

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X