6
votes

frais généraux pour un arène de tas vide

Mes outils sont Linux, GCC et Pthreads. Lorsque mon programme appelle nouveau / Supprimer de plusieurs threads, et lorsqu'il est contenté pour le tas, les arènes sont créées (voir le lien suivant pour référence http://www.bozemanpass.com/info/linux/malloc/linux_heap_contention.html ). Mon programme fonctionne 24x7 et les arènes sont toujours occasionnellement créées après 2 semaines. Je pense qu'il peut éventuellement être autant d'arènes que des threads. PS (1) affiche une consommation de mémoire alarmante, mais je soupçonne que seule une petite partie de celle-ci est effectivement cartographiée.

Quelle est la «surcharge» pour une arène vide? (Quelle quantité de mémoire plus par arène est utilisée que si toute allocation était confinée au tas traditionnel?)

Y a-t-il un moyen de forcer la création avant N Arenas? Y a-t-il un moyen de forcer la destruction d'arènes vides?


6 commentaires

Quelle version de glibc et de GCC utilisez-vous?


La réponse sera différente pour diverses versions Glibc.


Utilisez-vous ptmalloc? Quelle version GCC et GLIBC?


Il peut y avoir jusqu'à 65k Arenas. Le fil n'a pas d'arènes séparées, il y a une piscine commune pour toutes les fils.


Essayez de: trouver des fuites de mémoire dans le programme; réutiliser les fils autant que possible; Utilisez tcmalloc (de Google).


@osgx merci pour les idées. J'ai réparé les fuites avant de poster cette question et je sais que parce que le tas traditionnel ne se développe pas.


5 Réponses :


1
votes

struct malloc_state (AKA MASTE, AKA Arena Descripteur) a la taille

glibc-2.2 (256 + 18) * 4 octets = ~ 1 kb pour le mode 32 bits et ~ 2 Ko pour le mode 64 bits. glibc-2.3 (256 + 256/32 + 11 + NFASTBINS) * 4 = ~ 1.1-1.2 Ko en 32 bits et 2,4-2,5 kb pour 64 bits

Voir fichier GLIBC-X.X.X / MALLOC / MALLOC.C, struct Malloc_state


5 commentaires

Vous n'êtes pas obligé de l'arrondir jusqu'à la taille de bloc de pagination suivante? Merci d'avoir répondu!


C'est un descripteur d'arène interne. Chaque descripteur d'arène est placé dans un segment MMAP-ed. La limite de 65k maximum de MMAP est codée en papier. Chaque MMAP prend des ressources du noyau OS (VMA).


Tous les descripteurs de l'arène sont dans la liste liée de la circulaire de Main_arena. Chaque nouvelle arène est placée au début de la région de Mme-Ed avec décalage de taille de taille (heap_info) = 4xsizeof (vide *) = 16 ou 32 octets. Le tas (segment de lamped) est aligné et avoir une taille de heap_min_size à heap_max_size. Il a une alignement natif des appels de MMAP (= page = 4K). Le reste de la tasse (après heep_info et mstate) est utilisé pour Malloc_chunks (données Malloced).


Désolé, heep_min_size = 32 * 1024 (32KB) HEAUP_MAX_SIZE = 1024 * 1024 (1 Mo)


Tasse_max_size = 1 Mo est la taille maximale de l'arène. Ce sera donc beaucoup d'arènes dans le grand programme.



0
votes

de Malloc.c (GLIBC 2.3.5) Ligne 1546

/*
  -------------------- Internal data structures --------------------
   All internal state is held in an instance of malloc_state defined
   below. 
 ...
   Beware of lots of tricks that minimize the total bookkeeping space
   requirements. **The result is a little over 1K bytes** (for 4byte
   pointers and size_t.)
*/


0 commentaires

1
votes

Destruction d'Arenas Strong> ... Je ne sais pas encore, mais il y a un tel texte (brièvement - il dit non fort> à la possibilité de la destruction / la mémoire de coupe) de l'analyse http: //www.citi.umich. EDU / TECHRAPTS / RAPPORTS / CITI-TR-00-5.PDF à partir de 2000 (* Un peu obsolète). Nommez votre version Glibc.

Ptmalloc maintains a linked list of subheaps. To re-
duce lock contention, ptmalloc searchs for the first
unlocked subheap and grabs memory from it to fulfill
a malloc() request. If ptmalloc doesn’t find an
unlocked heap, it creates a new one. This is a simple
way to grow the number of subheaps as appropriate
without adding complicated schemes for hashing on
thread or processor ID, or maintaining workload sta-
tistics. However, there is no facility to shrink the sub-
heap list and nothing stops the heap list from growing
without bound. 


2 commentaires

Il y a un code pour la coupe du tas (Aka Arena) (HEP_TRIM). Mais cela ne fonctionne que pour une arène complètement libre.


Un tel "moyen simple" de la culture du nombre de sous-pauvres entraînera une création continue d'arènes (sous-secs). Le numéro d'arène peut également augmenter à cause de la fragmentation de tas.



0
votes

Pensez à utiliser TCMALLOC Formulaire Google-Perftools. Il est juste mieux adapté à filetés et applications de longue date de longue date . Et c'est très rapide . Jetez un coup d'œil sur http://goog-perfotill.sourceforge.net/doc/tcmalloc. HTML surtout sur les graphiques (mieux c'est mieux). Tcmalloc est deux fois mieux que ptmalloc.


2 commentaires

Merci pour l'idée. Remarque: la question initiale n'est pas sur la vitesse, je n'en ai pas besoin pour être plus rapide.


Grande vitesse est un bonus là-bas :)



0
votes

Dans notre application, le coût principal de plusieurs arènes a été une mémoire "sombre". La mémoire allouée par le système d'exploitation, que nous n'avons pas de références à.

Le motif que vous pouvez voir est P>

Thread X goes goes to alloc, hits a collision, creates a new arena.
Thread X makes some large allocations.
Thread X makes some small allocation(s).
Thread X stops allocating.


1 commentaires

Merci pour cela. Je voudrais sélectionner cette réponse comme «mieux» liée aux réponses d'Osgx.