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?
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
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
@ 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