35 votes

Allocateurs de mémoire multithread pour C / C ++

J'ai actuellement massivement multi-thread de l'application serveur, et je suis en train de magasiner, autour d'un bon multi-thread allocateur de mémoire.

Jusqu'à présent, je suis déchiré entre:

  • Du soleil umem
  • Google tcmalloc
  • Intel threading building blocks allocateur
  • Emery Berger hoard

De ce que j'ai trouvé hoard pourrait être le plus rapide, mais je n'avais pas entendu parler avant aujourd'hui, donc je suis sceptique si c'est vraiment aussi bon qu'il semble. Toute personne ayant une expérience personnelle de l'expérimentation de ces allocateurs?

17voto

hazzen Points 7315

J'ai utilisé tcmalloc et de lire à propos de Thésauriser. Ils ont des implémentations et la fois d'atteindre à peu près linéaire des performances de mise à l'échelle en fonction du nombre de threads/Cpu (selon les graphiques sur leurs sites respectifs).

Donc: si la performance est vraiment incroyablement crucial, puis de faire de la performance/les tests de charge. Sinon, il suffit de rouler les dés et choisir dans la liste (pondéré en fonction de la facilité d'utilisation sur votre plate-forme cible).

Et à partir de trshiv du lien, ça ressemble à Thésauriser, tcmalloc, et ptmalloc sont tous à peu près comparable pour la vitesse. Dans l'ensemble, tt ressemble ptmalloc est optimisé pour prendre aussi peu de place que possible, la Thésaurisation est optimisé pour un compromis de vitesse + l'utilisation de la mémoire, et tcmalloc est optimisé pour la vitesse pure.

11voto

strangelydim Points 521

La seule façon de vraiment dire ce qui allocateur de mémoire qui est bon pour votre application est d'essayer quelques-unes. Tous les allocateurs mentionnés ont été écrits par des gens intelligents et l'emporter sur les autres sur une microbenchmark ou d'une autre. Si votre application fait tout au long de la journée est un malloc de 8 octets morceau de fil Un et gratuit et cela dans le fil B, et n'a pas besoin de gérer quoi que ce soit d'autre, vous pourrait probablement écrire un allocateur de mémoire qui bat le pantalon large de l'un de ceux énumérés jusqu'à présent. Il ne veut tout simplement pas être très utile pour beaucoup de chose. :)

J'ai une certaine expérience à l'aide de Thésauriser où je travaille (suffisamment pour que l'un des plus obscurs de bugs question dans la récente version 3.8 a été trouvé comme un résultat de cette expérience). C'est un très bon programme d'allocation - mais comment bon, pour vous, dépend de votre charge de travail. Et vous n'avez à payer pour Thésauriser (même si c'est pas trop cher) pour l'utiliser dans un projet commercial sans GPL avec votre code.

Très légèrement adapté ptmalloc2 a été l'allocateur derrière la glibc malloc pour un certain temps maintenant, et il est donc extrêmement largement utilisé et testé. Si la stabilité est importante au-dessus de toutes choses, il pourrait être un bon choix, mais vous ne mentionnez pas dans votre liste, donc je vais supposer qu'il est out. Pour certaines charges de travail, c'est terrible - mais la même chose est vraie de tout usage général malloc.

Si vous êtes prêt à payer pour cela (et le prix est raisonnable, dans mon expérience), SmartHeap SMP est également un bon choix. La plupart des autres allocateurs mentionnés sont conçus comme des "drop-in" malloc/free nouveau/supprimer les remplacements qui peuvent être LD_PRELOAD avais. SmartHeap peut être utilisé de cette façon, en tant que bien, mais il comprend aussi toute une allocation liée à l'API qui vous permet d'affiner votre allocateurs au contenu de votre coeur. Dans les tests que nous avons fait (encore une fois, très spécifiques à une application en particulier), SmartHeap était environ le même que Thésauriser pour la performance lorsqu'ils agissent comme un malloc de remplacement; la vraie différence entre les deux est le degré de personnalisation. Vous pouvez obtenir de meilleures performances, moins d'usage général, vous avez besoin de votre allocateur de l'être.

Et selon votre cas d'utilisation, d'un usage général multithread allocateur pourrait ne pas être ce que vous voulez utiliser à tous; si vous êtes constamment malloc et free avec des objets qui sont toutes de la même taille, vous pouvez simplement écrire une simple dalle de l'allocateur. Dalle de répartition est utilisée dans plusieurs endroits dans le noyau Linux qui correspondent à cette description. (Je voudrais vous donner quelques liens utiles, mais je suis un "nouvel utilisateur" et de Dépassement de Pile a décidé que les nouveaux utilisateurs ne sont pas autorisés à être trop utile à tous dans une seule réponse. Google peuvent aider à sortir assez bien, cependant).

5voto

trshiv Points 1163

Personnellement, je préfère et recommande ptmalloc en tant qu'allocateur multithread. Hoard est bon, mais dans l'évaluation que mon équipe a faite entre Hoard et ptmalloc il y a quelques années, ptmalloc était meilleur. D'après ce que je sais, ptmalloc existe depuis un certain nombre d'années et est assez largement utilisé comme allocateur multithread.

Vous pourriez trouver cette comparaison utile.

4voto

littlenag Points 2124

Peut-être que c'est la mauvaise façon d'approcher ce que vous demandez, mais peut-être une tactique différente pourrait être employée tout à fait. Si vous êtes à la recherche d'un très rapide allocateur de mémoire peut-être que vous devriez vous demander pourquoi vous avez besoin de dépenser tout ce temps, de l'allocation de mémoire lorsque vous pourrait peut-être s'en sortir à l'allocation de pile de variables. L'allocation de pile, bien que de façon plus ennuyeux, fait pourrait vous faire économiser beaucoup de la manière de mutex de contention, ainsi que le maintien d'étrange corruption de la mémoire dans les questions de votre code. Aussi, vous avez potentiellement moins de fragmentation qui pourrait les aider.

3voto

jfm3 Points 13666

Nous avons utilisé thésaurisation sur un projet où j'ai travaillé il y a quelques années. Cela semblait très bien fonctionner. Je n'ai aucune expérience avec les autres répartiteurs. Il devrait être assez facile d'en essayer différentes et d'effectuer des tests de charge, non?

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