2010-07-28 3 views
1

Dans notre produit, nous utilisons une implémentation malloc qui repose exclusivement sur mmap pour l'allocation de mémoire. Nous faisons également une utilisation équitable de alloca ing. Nous venons de rencontrer un problème où mmap va allouer des régions réservées pour empiler l'espace (provoquant ainsi de très mauvaises choses quand l'un de nos plus gros déversements dans la région malloc'd).Les régions mmap allouées à partir de l'espace de pile réservé?

La limitation de l'allocation de nos processus est l'espace d'adressage de notre machine virtuelle, pas la mémoire physique. Nous avons regardé le fichier/proc/*/maps pendant que le processus s'exécute et nous avons vu que malloc mange n'importe quel espace d'adressage disponible. Il a finalement recours à l'allocation d'adresses au sein de la gamme rlimit-set, et finalement un grand alloca s'y étend.

Nous avons essayé de contourner ce problème par alloca en appliquant la totalité de la limite de la pile au démarrage, mais cela ne s'est pas avéré stable sur toutes les plates-formes (ça sépare la mémoire alloca d sur la machine de production 2.6).

Est-il possible de réserver réellement l'espace d'adressage? Que peut-on faire d'autre?

+0

En utilisant mmap() pour malloc() est très mauvaise idée. Abuser alloca() est encore pire ... La première fois que j'entends que quelqu'un a épuisé l'espace de mémoire virtuelle. Ou nous parlons de 32bit ici? – Dummy00001

+0

Au moins deux implémentations de malloc largement utilisées (phkmalloc et jemalloc) utilisent mmap anonyme. Celui que nous utilisons (jemalloc) est la bibliothèque malloc pour les versions récentes de stdlib. Quelqu'un doit penser que c'est une bonne idée. Oui, 32bit en utilisant PME avec une division de l'espace utilisateur moitié-n-moitié du noyau. De plus, nous sommes en train de faire le mapping d'une mémoire du noyau dans l'espace utilisateur, de sorte que notre plage d'adresses disponible ne concerne qu'un seul concert. – jdizzle

+0

@ Dummy00001: J'ai lu que OpenBSD malloc() mmap() s tout> = pageize. dlmalloc() (utilisé sur glibc et uClibc entre autres) a un MMAP_THRESHOLD, qui est généralement autour de 128Kb. – ninjalj

Répondre

0

Les anciennes versions de heartbeat s'assuraient que l'espace de pile était validé en appelant une fonction récursive qui memset() ed 1Kb à la fois à 0xff. Heartbeat a fait cela pour être capable de mlock() toute la mémoire dont il pourrait avoir besoin.

+0

Idéalement, je pourrais en quelque sorte réserver les adresses sans les forcer à être sauvegardées par la mémoire, mais en l'état, je pense que quelque chose comme ça est la seule façon de fonctionner. – jdizzle

Questions connexes