Question

J'ai un VPS avec peu de mémoire (256 Mo) que je suis en train d'utiliser pour le développement Common Lisp avec SBCL + Hunchentoot pour écrire des applications web simples. Une grande quantité de mémoire semble se habituer sans faire quoi que ce soit particulièrement complexe, et après un certain temps de servir les pages, il est à court de mémoire et soit devient fou en utilisant tous swap ou (s'il n'y a pas de swap) meurt juste.

Je dois donc aider à:

  • Découvrez ce qui utilise toute la mémoire (si elle est ou bibliothèques moi, surtout)
  • Limiter la quantité de mémoire qui SBCL est autorisé à utiliser, afin d'éviter des quantités massives de permutation
  • gérer les choses proprement lorsque la mémoire est épuisée, plutôt que de s'écraser (puisqu'il est une application web que je veux continuer et essayer de nettoyer).

Je suppose que les deux premiers sont assez simples, mais est le troisième possible? Comment les gens gèrent l'extérieur de la mémoire ou la mémoire des conditions limitées dans Lisp?

(En outre, je note qu'un SBCL 64 bits semble utiliser littéralement deux fois plus de mémoire que 32 bits. Est-ce prévu? Je peux exécuter une version 32 bits si elle permettra d'économiser beaucoup de mémoire)

Était-ce utile?

La solution

Afin de limiter l'utilisation de la mémoire de SbCl, utiliser des options de taille --dynamic-espace (par exemple, sbcl --dynamic-space-size 128 limitera l'utilisation de la mémoire à 128M).

Pour en savoir qui utilise la mémoire, vous pouvez appeler (room) (la fonction qui indique la quantité de mémoire utilisée) à des moments différents: au démarrage, après toutes les bibliothèques sont chargées, puis pendant le travail (de cource, appelez (sb-ext:gc :full t) avant chambre de ne pas mesurer les ordures qui n'a pas encore été collectées).

En outre, il est possible d'utiliser SBCL Profiler pour mesurer l'allocation de mémoire.

Autres conseils

  

Découvrez ce qui utilise toute la mémoire   (Si c'est des bibliothèques ou moi, en particulier)

Attila Lendvai possède un code spécifique à SBCL pour savoir où un des objets attribués vient. Reportez-vous à http://article.gmane.org/gmane.lisp. acier bank.devel / 12903 et lui écrire un message privé si nécessaire.

Assurez-vous d'essayer une autre mise en oeuvre, de préférence avec un GC précis (comme Clozure CL) pour assurer ce n'est pas une fuite spécifique à la mise en œuvre.

  

Limiter la quantité de mémoire qui SBCL   est autorisé à utiliser, pour éviter massif   les quantités de permutation

déjà répondu par d'autres.

  

gérer les choses proprement lorsque la mémoire fonctionne   dehors, plutôt que de s'écraser (car il est   une application web que je veux continuer et   essayez de nettoyer).

256MB est serré, mais de toute façon: planifier une base récurrente (peut-être 1 s) fil chronométré qui vérifie l'espace libre restant. Si l'espace libre est inférieur à X puis utilisez exec () pour remplacer l'image du processus de SBCL en cours avec un nouveau.

Si vous ne disposez pas des déclarations de type, je me attends à 64 bits Lisp pour prendre l'espace d'un 32 bits une fois. Même une plaine (petite) int utilisera un morceau de mémoire 64 bits. Je ne pense pas que ça va utiliser moins d'un mot machine, à moins que vous déclarez.

Je ne peux pas aider # 2 et # 3, mais si vous figurez dehors # 1, je soupçonne que ce ne sera pas un problème. J'ai vu des cas SBCL / Hunchentoot en cours d'exécution pendant des siècles. Si j'utilise une quantité scandaleuse de la mémoire, il est généralement ma faute. : -)

Je ne serais pas surpris par un 64 bits SBCL deux fois en utilisant la meory, car il sera probablement utiliser une cellule 64 bits plutôt que 32 bits l'un, mais ne pouvait pas dire avec certitude sans vérifier réellement.

choses typiques qui gardent la mémoire traîner plus longtemps que prévu sont des références qui ne sont plus utiles qui ont encore un chemin à l'ensemble de l'allocation racine (tables de hachage sont, je trouve, une bonne façon de laisser ces choses s'attardent). Vous pouvez essayer intercalant appels explicites à GC dans votre code et assurez-vous (dans la mesure du possible) pas stocker les choses dans les variables globales.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top